1

インデックスを適切に使用するには、検索引数としてfilter述語を作成する必要があるためDATETIME、この場合は関数を使用できません。

日付と時刻の比較には<=andオペランドを使用する必要がありますが、句もあります。>=BETWEEN

したがって、BETWEEN終了日には問題があるため、単純な算術オペランドを使用することをお勧めします。

およびBETWEENよりも好ましいコンテキストはありますか?<=>=

4

4 に答える 4

6

間に違いがあるかどうかを尋ねる場合

where X between 1 and 10

where X >= 1 and X <= 10

いいえ、違いはありません。これは言語の便利な機能拡張にすぎず、生活を楽にしようとする多くの機能の 1 つです。式は、望ましい結果を非常に明確にBETWEEN表現します。

COALESCE関数に似ていますが、値CASEをチェックする式をより簡単に記述できNULLます。

于 2013-01-13T16:11:17.440 に答える
4

したがって、 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 秒単位で丸められます」

于 2013-01-13T16:59:02.083 に答える
1

数値型を使用する場合の読みやすさに役立ちます。

2 つの整数値の間の整数列の値を確認する必要がある場合:

theColumn BETWEEN 5 and 25
于 2013-01-13T15:51:38.510 に答える
1

BETWEEN は or で接続された 2 つの別個の操作に変換されます:a BETWEEN b AND cは と同等a >= B AND a <= cです。このコンテキストでの同等とは、機能的に同等であることを意味します。オプティマイザーと実行エンジンで同じ動作が生成されます。

問題は、自然言語の単語間の単語があいまいであるという事実にあります。境界を含めるかどうかは、必ずしも明らかではない多くの要因に依存します。プログラミングから遠ざける必要があるあいまいな動作。

T-SQL BETWEEN には明確に定義された動作がありますが、それがどれであるかを忘れがちです。コードは、書かれるよりも読まれることが多いため、コードをできるだけ読みやすくすることが重要です。読者は BETWEEN キーワードに遭遇するたびに、立ち止まって境界の振る舞いについて考える必要があります。これは気が散り、見つけにくいバグにもつながります。

日付計算の終了境界に問題があると聞いた理由は、人々が BETWEEN の使用を最も頻繁に間違えた場合です。

于 2013-01-13T15:59:52.550 に答える