22

たとえば、2008-01-23 00:00:00.000 の Date の場合、特定の日の最後の可能な時刻を達成しようとしています。おそらく Date で dateadd 関数を使用して、2008-01-23 23:59:59.999 が必要です。分野?

4

5 に答える 5

27

答えは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機能が無効になります。つまり、使用された可能性のあるインデックスは使用されません。

于 2008-10-03T15:12:50.873 に答える
15
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))

私はあなたが最初にc#を持っていると思っていました..他の誰かがこれに出くわした場合に備えて、これをここに残します.

DateTime now = DateTime.Now;
DateTime endofDay = now.Date.AddDays(1).AddMilliseconds(-1);

「今」変数を、把握しようとしている日付に置き換えることができます

于 2008-10-03T15:10:41.953 に答える
8

翌日の開始に-1ミリ秒を追加します(本当にうまくいきたい場合は、DateAddはナノ秒もサポートします)。

ただし、ほとんどの場合、この値を比較に使用するだけで、その場合はさらに簡単になります。

このようなものではなく:

AND @CompareDate <= [LastTimeforThatday]

またはこれ:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]

このようにしてください:

AND @CompareDate < [BeginningOfNextDay]

またはこれ:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
于 2008-10-03T15:28:43.040 に答える
3

なぜそれに戻るのですか?

SELECT DATEADD(ms, 86399997, *yourDate*)
于 2015-07-20T19:39:13.993 に答える
0

私は使用できました:

select {fn curdate()} + ' 23:59:59.000'

また

select DATEADD(ss,-1,DATEADD(DAY,1,CAST({fn curdate()} as DATETIME)))

一日の終わりを迎える

于 2022-02-17T21:22:26.870 に答える