特定の日の最後の可能な時間を達成しようとしています。たとえば、Date of 2008-01-23 00:00:00.000の場合、おそらくDateでdateadd関数を使用して、2008-01-23 23:59:59.999が必要になります。フィールド?
答えはSELECT DATEADD(ms, -3, '2008-01-24')
です。説明は以下のとおりです。
から マークのブログ :
しかし、待ってください、マーク...あなたは
BETWEEN
を使いたいと言いましたが、そのクエリにはそれがありません...それはBETWEEN
包括的 、つまりエンドポイントが含まれます。翌月の初日の深夜に期限が切れる注文があった場合、それは含まれます。では、どのようにして期末の適切な値を取得しますか?日付部分を使用して組み立てるのは間違いなく[〜#〜]ではありません[〜#〜]です(ただし、必ずそうする必要があります。最大時間として23:59:59.997 ...ミリ秒を忘れないでください)。それを正しく行うために、Microsoft SQL ServerDATETIME
列の解像度が最大で3ミリ秒(変更されないもの)であるという近親相姦の知識を使用します。したがって、上記の期間終了式のいずれかから3ミリ秒を引くだけです。たとえば、昨日(現地時間)の最後の可能な瞬間は次のとおりです。SELECT DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0))
したがって、今月の注文を
BETWEEN
クエリとして実行するには、次のように使用できます。SELECT [ID] FROM [dbo].[Orders] WHERE [ShipDue] BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()), 0) AND DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()) + 1, 0))
入力パラメータ[〜#〜] not [〜#〜]列に対して計算を行うことを常に忘れないでください。そうしないと、-が強制終了されます。 [〜#〜] sarg [〜#〜] -クエリの機能。つまり、使用された可能性のあるインデックスは使用されません。
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))
最初はc#を持っていると思いました。他の誰かがこれに遭遇した場合に備えて、これをここに残しておきます。
DateTime now = DateTime.Now;
DateTime endofDay = now.Date.AddDays(1).AddMilliseconds(-1);
'now'変数を、把握しようとしている任意の日に置き換えることができます
next日のstartに-1 millisecondsを追加します(本当にうまくいきたい場合は、DateAddはナノ秒もサポートします)。
しかし、ほとんどの場合、この値を比較に使用したいだけであり、その場合はさらに簡単です。
このようなものではなく:
AND @CompareDate <= [LastTimeforThatday]
またはこれ:
@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]
このようにしてください:
AND @CompareDate < [BeginningOfNextDay]
またはこれ:
AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
なぜそれに戻るのですか?
SELECT DATEADD(ms, 86399997, *yourDate*)