web-dev-qa-db-ja.com

SQL Server:2つの日付の間のレコードをフェッチしますか?

SQLでは、between andを使用して、2つの日付間のデータを取得するSELECTステートメントを記述します

例:

select * 
from xxx 
where dates between '2012-10-26' and '2012-10-27'

ただし、返される行は26日のみであり、26日と27日ではありません。

手伝って頂けますか?ありがとうございました。

17
Ssasidhar

他の人が答えたように、おそらく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と悪魔の共通点は?

14
ypercubeᵀᴹ

より明確にする必要があり、開始時刻と終了時刻もミリ秒単位で追加する必要があります。

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'

12
Oded

これを明確に記述する方法は(つまり、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に明示的に伝えます。

2
RichardTheKiwi

あなたの質問は、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は私たちの生活に投入されました。

2
greg

これを試して:

select * 
from xxx 
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
1
krishnang

次のクエリを使用してみてください

select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'
0
Hiren Dhaduk