web-dev-qa-db-ja.com

where句の日時

SQLのwhere句で12/20/2008を選択するにはどうすればよいですか?

サーバーはSQL Server 2005です。

select * from tblErrorLog
where errorDate = '12/20/2008'
51
WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'
72
LukeH

まず、日付と時刻にISO-8601標準形式を使用することをお勧めします。これは、SQL Serverの言語と地域の設定に関係なく機能します。 ISO-8601はYYYYMMDD形式です-スペース、ダッシュなし-データのみ:

select * from tblErrorLog
where errorDate = '20081220'

第二に、SQL Server 2005 DATETIMEには常に時間が含まれることに注意する必要があります。日付部分のみで完全一致をチェックすると、0:00:00の時間に一致する行のみが取得されます。

上記の推奨範囲クエリのいずれかを使用するか、SQL Server 2008でDATEのみの日時を使用するか、次のようなチェックを行うことができます。

select * from tblErrorLog
where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008

どちらがあなたに最も適しています。

このクエリを頻繁に実行する必要がある場合は、DATETIMEを正規化して日付のみを含めるか、DAY、MONTH、YEARの計算列を追加できます。

ALTER TABLE tblErrorLog
   ADD ErrorDay AS DAY(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorYear AS YEAR(ErrorDate) PERSISTED

その後、より簡単にクエリを実行できます。

select * from tblErrorLog
where ErrorMonth = 5 AND ErrorYear = 2009

などなど。これらのフィールドは計算されてPERSISTEDされているため、常に最新で常に最新であり、永続的であるため、必要に応じてインデックスを作成することもできます。

24
marc_s

どのデータベースを使用しているかはわかりませんが、MS SQL Serverでは

WHERE DateField = {d '2008-12-20'}

タイムスタンプフィールドの場合、範囲が必要です。

WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
15
J__

SQL Server DateTimeを話していると仮定します

注:BETWEENにはboth範囲の終わりが含まれるため、技術的にはこのパターンは間違っています。

errorDate BETWEEN '12/20/2008' AND '12/21/2008'

そのような時間範囲の私の好ましい方法は次のとおりです。

'20081220' <= errorDate AND errordate < '20081221'

一般的なインデックス(範囲スキャン、SARGable、機能なし)で動作し、SQL Serverの時間粒度(23:59:59.997など)に依存することなく、翌日の真夜中に正しくクリップします。

7
onupdatecascade

変換関数を使用して、特定の日のすべてのエントリを取得します。

Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'

詳細については、 CASTおよびCONVERT を参照してください

5
Middletone
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')
1
Meff