SQL では、次SELECT
を使用して、2 つの日付の間のデータをフェッチするステートメントを作成します。between and
元:
select *
from xxx
where dates between '2012-10-26' and '2012-10-27'
ただし、返される行は 26 番目と 27 番目ではなく、26 番目のみです。
手伝って頂けますか?ありがとうございました。
SQL では、次SELECT
を使用して、2 つの日付の間のデータをフェッチするステートメントを作成します。between and
元:
select *
from xxx
where dates between '2012-10-26' and '2012-10-27'
ただし、返される行は 26 番目と 27 番目ではなく、26 番目のみです。
手伝って頂けますか?ありがとうございました。
他の人が答えているように、おそらくデータ型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'
データベースはとして非常によく解釈できます'2012-10-27 00:00:00.000'
。
これを明確に書く方法は次のとおりです(つまり、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に明示的に通知します。
あなたの質問は、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 は私たちをこれらの問題から隔離するために私たちの生活に取り入れられました。
これを試して:
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'