19

SQL では、次SELECTを使用して、2 つの日付の間のデータをフェッチするステートメントを作成します。between and

元:

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

ただし、返される行は 26 番目と 27 番目ではなく、26 番目のみです。

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

4

6 に答える 6

17

他の人が答えているように、おそらくデータ型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

于 2012-10-27T11:00:37.510 に答える
13

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

select * 
from xxx 
where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997'

'2012-10-27'データベースはとして非常によく解釈できます'2012-10-27 00:00:00.000'

于 2012-10-27T10:35:19.993 に答える
4

これを明確に書く方法は次のとおりです(つまり、2番目の日付を1増やして作成します<

select * 
from xxx 
where dates >= '20121026'
  and dates <  '20121028'

SQL Server 2008以降を使用している場合は、SARGabilityを維持しながら、CASTをDATEとして安全にすることができます。

select * 
from xxx 
where CAST(dates as DATE) between '20121026' and '20121027'

datesこれは、BETWEEN範囲と比較するために、列のDATE部分のみに関心があることをSQLServerに明示的に通知します。

于 2012-10-27T11:00:44.293 に答える
2

あなたの質問は、BETWEEN を正しく使用する方法を尋ねたのではなく、予期せず切り捨てられた結果について助けを求めました...

他の回答で言及/ほのめかしているように、問題は日付に加えて時間セグメントがあることです。

私の経験では、date diff を使用することは、キーボードの余分な磨耗に見合うだけの価値があります。それはあなたが望むものを正確に表現することを可能にし、あなたは覆われています.

select * 
from xxx 
where datediff(d, '2012-10-26', dates) >=0
and  datediff(d, dates,'2012-10-27') >=0

datediff を使用すると、最初の日付が 2 番目の日付より前の場合、正の数値が得られます。上記を記述するにはいくつかの方法があります。たとえば、常に最初にフィールドを持ち、次に定数を持ちます。オペレーターをひっくり返すだけです。それは個人的な好みの問題です。

一方または両方の等号を削除することで、エンドポイントを含めるか除外するかを明示できます。

BETWEEN は、両方のエンドポイントが真夜中 (つまり DATE) であると想定されているため、この場合に機能します。エンドポイントも DATETIME であった場合、BETWEEN を使用するにはさらに多くのキャストが必要になる場合があります。私の考えでは、DATEDIFF は私たちをこれらの問題から隔離するために私たちの生活に取り入れられました。

于 2015-09-09T18:46:38.837 に答える
1

これを試して:

select * 
from xxx 
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
于 2012-10-27T10:41:41.500 に答える
0

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

select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'
于 2012-10-27T20:11:48.050 に答える