Как получить последнее возможное время определенного дня - PullRequest
18 голосов
/ 03 октября 2008

Я пытаюсь достичь последнего возможного времени определенного дня, например, для Даты 2008-01-23 00: 00: 00.000 Мне понадобится 2008-01-23 23: 59: 59.999, возможно, с помощью функции dateadd в поле Дата?

Ответы [ 4 ]

22 голосов
/ 03 октября 2008

Ответ 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 , то есть индексы, которые могли используется не.

14 голосов
/ 03 октября 2008
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))

Сначала я думал, что у вас есть c # ... Я оставлю это здесь на случай, если кто-нибудь еще наткнется на это.

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

Вы можете заменить переменную «сейчас» тем днем, который вы пытаетесь выяснить

8 голосов
/ 03 октября 2008

Добавить -1 миллисекунды к началу следующего следующего дня (DateAdd даже поддерживает наносекунды, если вы хотите получить очень хорошо).

Но, скорее всего, вы просто хотите использовать это значение в сравнении, и в этом случае оно еще проще.

Вместо чего-то вроде этого:

AND @CompareDate <= [LastTimeforThatday]

или это:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]

Сделай так:

AND @CompareDate < [BeginningOfNextDay]

или это:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
3 голосов
/ 20 июля 2015

Зачем обратно в это?

SELECT DATEADD(ms, 86399997, *yourDate*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...