次のようなクエリがあります。
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
ただし、1日のデータがあっても結果は得られません。
created_at
のよう2013-05-01 22:25:19
に見えます、それは時間と関係があるのではないでしょうか?これをどのように解決できますか?
日付範囲を大きくすると問題なく機能しますが、単一の日付でも(包括的に)機能するはずです。
次のようなクエリがあります。
SELECT * FROM Cases WHERE created_at BETWEEN '2013-05-01' AND '2013-05-01'
ただし、1日のデータがあっても結果は得られません。
created_at
のよう2013-05-01 22:25:19
に見えます、それは時間と関係があるのではないでしょうか?これをどのように解決できますか?
日付範囲を大きくすると問題なく機能しますが、単一の日付でも(包括的に)機能するはずです。
回答:
それは包括的です。日時と日付を比較しています。2番目の日付は、その日が始まる真夜中と解釈されます。
これを修正する1つの方法は次のとおりです。
SELECT *
FROM Cases
WHERE cast(created_at as date) BETWEEN '2013-05-01' AND '2013-05-01'
それを修正する別の方法は、明示的なバイナリ比較です
SELECT *
FROM Cases
WHERE created_at >= '2013-05-01' AND created_at < '2013-05-02'
Aaron Bertrandは日付に関する長いブログエントリ(ここ)を持っています。そこで彼はこれと他の日付の問題について議論しています。
dateadd
て翌日を取得することをお勧めします。
set dateformat dmy;select month(cast('2013-05-01' as datetime)); =1
>=
)で閉じ、もう一方の端()で開く間隔を使用していると思い<
ます。
where
句の列はキャストしないでください。列のインデックスが失われるためです。それは本当に悪いパターンです。
BETWEEN
構文の2番目の日付参照は、魔法のように「1日の終わり」と見なされると想定されていましたが、これは正しくありません。
つまり、これは予想されたものです。
SELECT * FROMケース WHERE created_at '2013-05-01'の始まりとの終わりの間
しかし、実際に何が起こるのですか?
SELECT * FROMケース WHERE created_at BETWEEN '2013-05-01 00:00:00 + 00000 ' AND '2013-05-01 00:00:00 + 00000 '
これは以下と同等になります:
SELECT * FROM Cases WHERE created_at = '2013-05-01 00:00:00 + 00000 '
問題は、約認識/期待の一つであるBETWEEN
れない低い値および範囲の上側の値との両方を含むが、これらありません魔法の日がか「の終わり」「の始まり」を作ります。
BETWEEN
日付範囲でフィルタリングする場合は避けてください。
常に使用する>= AND <
代わりに
SELECT * FROMケース WHERE(のcreated_at > = '20130501' とのcreated_at < '20130502')
括弧はここではオプションですが、より複雑なクエリでは重要になる場合があります。
次の2つのオプションのいずれかを実行する必要があります。
between
条件に含める:(... where created_at between '2013-05-01 00:00:00' and '2013-05-01 23:59:59'
非推奨...最後の段落を参照)between
ます。次に、2番目の値に1日を追加する必要があることに注意してください。... where (created_at >= '2013-05-01' and created_at < '2013-05-02')
私の個人的な好みは2番目のオプションです。また、Aaron Bertrandは、なぜそれを使用すべきかについて非常に明確な説明をしています。
BETWEEN
時間を含む日付範囲クエリには使用しないでください。方法が多すぎるとうまくいかない場合があります。
日付としてタイムスタンプを使用するだけです:
SELECT * FROM Cases WHERE date(created_at)='2013-05-01'
'DATE' is not a recognized built-in function name.
、stackoverflow.com / a / 20973452/4233593
cast(created_at as date)
これは、SQL Serverの2008以降のバージョンでのみ機能します
古いバージョンを使用している場合は、
convert(varchar, created_at, 101)
convert(varchar, created_at, 101)
結果は次のようにdd/MM/yyyy
なり、OPの文字列はyyyy-MM-dd
です。この答えは機能しないと思います;)