たとえば、2008-01-23 00:00:00.000 の Date の場合、特定の日の最後の可能な時刻を達成しようとしています。おそらく Date で dateadd 関数を使用して、2008-01-23 23:59:59.999 が必要です。分野?
5 に答える
答えはSELECT DATEADD(ms, -3, '2008-01-24')
です。説明は以下です。
マークのブログから:
でも待ってください、マーク... あなたは を使いたいと言いまし
BETWEEN
たが、そのクエリにはそれがありません... それBETWEEN
は が inclusiveであるためです。つまり、エンドポイントが含まれています。翌月の最初の日の午前 0 時が期限の注文があった場合、それは含まれます。では、期末に適切な値を取得するにはどうすればよいでしょうか。日付部分を使用して 1 つを組み立てることは絶対にありません(しかし、そうしなければなりません。最大時間として 23:59:59.997 であることを覚えておいてください...ミリ秒を忘れないでください)。DATETIME
それを正しく行うために、Microsoft SQL Server列がせいぜい持っている近親相姦の知識を使用します。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))
入力パラメーターに対して計算を行うことを常に確認してください。列ではありません。そうしないと、クエリの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);
「今」変数を、把握しようとしている日付に置き換えることができます
翌日の開始に-1ミリ秒を追加します(本当にうまくいきたい場合は、DateAddはナノ秒もサポートします)。
ただし、ほとんどの場合、この値を比較に使用するだけで、その場合はさらに簡単になります。
このようなものではなく:
AND @CompareDate <= [LastTimeforThatday]
またはこれ:
@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]
このようにしてください:
AND @CompareDate < [BeginningOfNextDay]
またはこれ:
AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
なぜそれに戻るのですか?
SELECT DATEADD(ms, 86399997, *yourDate*)
私は使用できました:
select {fn curdate()} + ' 23:59:59.000'
また
select DATEADD(ss,-1,DATEADD(DAY,1,CAST({fn curdate()} as DATETIME)))
一日の終わりを迎える