Подтвердить что ты не робот

Как получить последнее возможное время определенного дня

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

4b9b3361

Ответ 1

Ответ SELECT DATEADD(ms, -3, '2008-01-24'), пояснение ниже.

Из Блог Marc:

Но подождите, Марк... вы сказали, что хотите использовать 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))

Помните, что всегда делайте математику с входными параметрами, столбцами НЕ, или вы убьете SARG -защищенность запроса, что означает, что индексы, которые могли быть использованы, не являются.

Ответ 2

SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))

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

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

Вы можете заменить переменную 'now' на любой день, который вы пытаетесь выяснить

Ответ 3

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

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

Вместо этого:

AND @CompareDate <= [LastTimeforThatday]

или это:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]

Сделайте это так:

AND @CompareDate < [BeginningOfNextDay]

или это:

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

Ответ 4

Почему вернемся к нему?

SELECT DATEADD(ms, 86399997, *yourDate*)