11

今日作成されたすべての行を取得できません。getdate()Cast、などの複数の関数を使用Convertしましたが、すべて無駄です。

これは私の基本的なクエリです:

SELECT timeId
FROM table_roaster_time_table
WHERE (user_id = @user_id) AND (DATEDIFF(d, date, GETDATE()) = 0)

timeId提供されるテーブルからtable_roaster_time_table取得したいのですuseridが、日付は今日です。

どうすればいいですか?

4

1 に答える 1

28

列にインデックスを使用する可能性を維持するために[date](現在は存在しない場合でも、将来的には存在する可能性があります)、次のことを試してください。

AND [date] >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP))
AND [date] <  DATEADD(DAY, 1, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));

SQL Server 2008 以降を使用している場合は、次のようにしてコードを短縮できますが、[date]存在する場合は引き続きインデックスを利用できます。

AND CONVERT(DATE, [date]) = CONVERT(DATE, CURRENT_TIMESTAMP);

編集

なぜ3/6/20126 月 3 日ではなく 3 月 6 日なのか混乱しているように見えるので、次のようなあいまいな日付リテラル'3/6/2012'をデータベースに手動で挿入する代わりに、列を次のようにデフォルトにすることをお勧めします。

ALTER TABLE dbo.table_roaster_time_table
  ALTER COLUMN [date] DATETIME NOT NULL;

ALTER TABLE dbo.table_roaster_time_table
  ADD CONSTRAINT df_date DEFAULT (CURRENT_TIMESTAMP)
  FOR [date];

日付リテラルを挿入する場合は、少なくとも次のような安全で明確な形式を使用してYYYYMMDDください。

INSERT dbo.table_roaster_time_table([date]) VALUES('20120603');

これで混乱はありません。

于 2012-06-03T16:04:01.383 に答える