web-dev-qa-db-ja.com

特定の日の最後の可能な時間を取得するにはどうすればよいですか

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

19
test

答えはSELECT DATEADD(ms, -3, '2008-01-24')です。説明は以下のとおりです。

から マークのブログ

しかし、待ってください、マーク...あなたはBETWEENを使いたいと言いましたが、そのクエリにはそれがありません...それはBETWEEN包括的 、つまりエンドポイントが含まれます。翌月の初日の深夜に期限が切れる注文があった場合、それは含まれます。では、どのようにして期末の適切な値を取得しますか?日付部分を使用して組み立てるのは間違いなく[〜#〜]ではありません[〜#〜]です(ただし、必ずそうする必要があります。最大時間として23:59:59.997 ...ミリ秒を忘れないでください)。それを正しく行うために、Microsoft SQL Server DATETIME列の解像度が最大で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 [〜#〜] -クエリの機能。つまり、使用された可能性のあるインデックスは使用されません。

22
bdukes
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'変数を、把握しようとしている任意の日に置き換えることができます

14
Shaun Bowe

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

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

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

AND @CompareDate <= [LastTimeforThatday]

またはこれ:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]

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

AND @CompareDate < [BeginningOfNextDay]

またはこれ:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
8
Joel Coehoorn

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

SELECT DATEADD(ms, 86399997, *yourDate*)
3
davef