インデックスを適切に使用するには、検索引数としてfilter述語を作成する必要があるためDATETIME
、この場合は関数を使用できません。
日付と時刻の比較には<=
andオペランドを使用する必要がありますが、句もあります。>=
BETWEEN
したがって、BETWEEN
終了日には問題があるため、単純な算術オペランドを使用することをお勧めします。
およびBETWEEN
よりも好ましいコンテキストはありますか?<=
>=
インデックスを適切に使用するには、検索引数としてfilter述語を作成する必要があるためDATETIME
、この場合は関数を使用できません。
日付と時刻の比較には<=
andオペランドを使用する必要がありますが、句もあります。>=
BETWEEN
したがって、BETWEEN
終了日には問題があるため、単純な算術オペランドを使用することをお勧めします。
およびBETWEEN
よりも好ましいコンテキストはありますか?<=
>=
間に違いがあるかどうかを尋ねる場合
where X between 1 and 10
対
where X >= 1 and X <= 10
いいえ、違いはありません。これは言語の便利な機能拡張にすぎず、生活を楽にしようとする多くの機能の 1 つです。式は、望ましい結果を非常に明確にBETWEEN
表現します。
COALESCE
関数に似ていますが、値CASE
をチェックする式をより簡単に記述できNULL
ます。
したがって、 BETWEEN には終了日の問題があるため、単純な算術オペランドを使用することをお勧めします。
BETWEEN には終了日 (日付と時刻の値) に関する問題はありませんが、開発者は、日付と時刻 ( DATETIMEデータ型) の値にも時間コンポーネントがあることを忘れている人がいるためです。
だから、書く
SELECT ...
FROM MyTable
WHERE MyDateTimeColumn BETWEEN '20130101' AND '20130113'
'20130113'
means '20130113 00:00:00.000'
(and not '20130113 23:59:59.997'
) and BETWEEN '20130101' AND '20130113'
meansであるため、これら 2 つの日付の間のすべてのレコードを表示したい場合、 は間違っていますBETWEEN '20130101' AND '20130113 00:00:000.000'
。
いくつかの解決策:
1)
SELECT ...
FROM MyTable
WHERE MyDateTimeColumn BETWEEN '20130101' AND '20130113 23:59:59.997'
2)
SELECT ...
FROM MyTable
WHERE CONVERT(DATE, MyDateTimeColumn) BETWEEN '20130101' AND '20130113'
3)
DECLARE @StartDate DATETIME = '20120103'
DECLARE @EndDate DATETIME = '20120103'
SET @EndDate = DATEADD(MILLISECOND, -3, DATEADD(DAY, 0, DATEDIFF(DAY, 0, @EndDate)+1))
SELECT @StartDate AS [SD], @EndDate [ED]
SELECT ...
FROM MyTable
WHERE MyDateTimeColumn BETWEEN @StartDate AND @EndDate
結果:
SD ED
----------------------- -----------------------
2012-01-03 00:00:00.000 2012-01-03 23:59:59.997
(1 row(s) affected)
...
注:DATETIME
値は「.000、.003、または .007 秒単位で丸められます」。
数値型を使用する場合の読みやすさに役立ちます。
2 つの整数値の間の整数列の値を確認する必要がある場合:
theColumn BETWEEN 5 and 25
BETWEEN は or で接続された 2 つの別個の操作に変換されます:a BETWEEN b AND c
は と同等a >= B AND a <= c
です。このコンテキストでの同等とは、機能的に同等であることを意味します。オプティマイザーと実行エンジンで同じ動作が生成されます。
問題は、自然言語の単語間の単語があいまいであるという事実にあります。境界を含めるかどうかは、必ずしも明らかではない多くの要因に依存します。プログラミングから遠ざける必要があるあいまいな動作。
T-SQL BETWEEN には明確に定義された動作がありますが、それがどれであるかを忘れがちです。コードは、書かれるよりも読まれることが多いため、コードをできるだけ読みやすくすることが重要です。読者は BETWEEN キーワードに遭遇するたびに、立ち止まって境界の振る舞いについて考える必要があります。これは気が散り、見つけにくいバグにもつながります。
日付計算の終了境界に問題があると聞いた理由は、人々が BETWEEN の使用を最も頻繁に間違えた場合です。