SQLでは、between and
を使用して、2つの日付間のデータを取得するSELECT
ステートメントを記述します
例:
select *
from xxx
where dates between '2012-10-26' and '2012-10-27'
ただし、返される行は26日のみであり、26日と27日ではありません。
手伝って頂けますか?ありがとうございました。
他の人が答えたように、おそらくDATETIME
(または他のバリエーション)列があり、DATE
データ型はありません。
DATE
を含む、すべてに有効な条件を次に示します。
SELECT *
FROM xxx
WHERE dates >= '20121026'
AND dates < '20121028' --- one day after
--- it is converted to '2012-10-28 00:00:00.000'
;
@ Aaron Bertrand はこれについてブログに書いています:BETWEEN
と悪魔の共通点は?
より明確にする必要があり、開始時刻と終了時刻もミリ秒単位で追加する必要があります。
select *
from xxx
where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997'
データベースは、'2012-10-27'
as '2012-10-27 00:00:00.000'
。
これを明確に記述する方法は(つまり、2番目の日付を1つ増やして<
)
select *
from xxx
where dates >= '20121026'
and dates < '20121028'
SQL Server 2008以降を使用している場合、 SARGability を保持しながら、DATEとして安全にCASTできます。
select *
from xxx
where CAST(dates as DATE) between '20121026' and '20121027'
これは、BETWEEN範囲と比較するためにdates
列のDATE部分のみに関心があることをSQL Serverに明示的に伝えます。
あなたの質問は、BETWEENを正しく使用する方法を尋ねるのではなく、予期しない切り捨てられた結果の助けを求めました...
他の回答で言及/ヒントしているように、問題は日付に加えて時間セグメントがあることです。
私の経験では、date diffを使用することは、キーボードの余分な摩耗/破損の価値があります。それはあなたが望むものを正確に表現することを可能にし、あなたはカバーされます。
select *
from xxx
where datediff(d, '2012-10-26', dates) >=0
and datediff(d, dates,'2012-10-27') >=0
datediffを使用すると、最初の日付が2番目の日付より前の場合、正の数が得られます。上記を記述する方法はいくつかあります。たとえば、常に最初にフィールドを持ち、次に定数を持ちます。オペレーターをひっくり返すだけです。個人的な好みの問題。
1つまたは両方の等号をドロップすることにより、エンドポイントを含めるか除外するかを明示できます。
エンドポイントは両方とも深夜(つまりDATE)であると想定されるため、BETWEENが機能します。エンドポイントもDATETIMEであった場合、BETWEENを使用するにはさらにキャストが必要になる場合があります。私の考えでは、これらの問題から私たちを隔離するために、DATEDIFFは私たちの生活に投入されました。
これを試して:
select *
from xxx
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
次のクエリを使用してみてください
select *
from xxx
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'