SQLのwhere
句で12/20/2008を選択するにはどうすればよいですか?
サーバーはSQL Server 2005です。
select * from tblErrorLog
where errorDate = '12/20/2008'
WHERE datetime_column >= '20081220 00:00:00.000'
AND datetime_column < '20081221 00:00:00.000'
まず、日付と時刻に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されているため、常に最新で常に最新であり、永続的であるため、必要に応じてインデックスを作成することもできます。
どのデータベースを使用しているかはわかりませんが、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'}
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など)に依存することなく、翌日の真夜中に正しくクリップします。
変換関数を使用して、特定の日のすべてのエントリを取得します。
Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'
詳細については、 CASTおよびCONVERT を参照してください
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')