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

голоса
15

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

Задан 03/10/2008 в 16:06
источник пользователем
На других языках...                            


4 ответов

голоса
22

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

Ответил 03/10/2008 в 16:12
источник пользователем

голоса
13
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))

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

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

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

Ответил 03/10/2008 в 16:10
источник пользователем

голоса
8

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

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

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

AND @CompareDate <= [LastTimeforThatday]

или это:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]

Делай это так:

AND @CompareDate < [BeginningOfNextDay]

или это:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
Ответил 03/10/2008 в 16:28
источник пользователем

голоса
1

Почему обратно в него?

SELECT DATEADD(ms, 86399997, *yourDate*)
Ответил 20/07/2015 в 19:39
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more