Округление SQL DateTime до полуночи
У меня небольшая проблема с моим SQL-запросом. Я использую функцию GETDATE, однако, допустим, я выполняю скрипт в 5 вечера, он будет вытаскивать записи между 12/12/2011 5 вечера до 12/18/2011 5 вечера. Как я могу заставить его подтянуть записи за весь 12/12/2011-12/18/2011 в основном игнорировать время.
мой скрипт:
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate > (GETDATE()-6)
8 ответов:
в SQL Server 2008 и новее вы можете привести
DateTimeдоDate, который удаляет элемент времени.WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate >= (cast(GETDATE()-6 as date))в SQL Server 2005 и ниже вы можете использовать:
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate >= DateAdd(Day, Datediff(Day,0, GetDate() -6), 0)
вот самая простая вещь, которую я нашел
-- Midnight floor of current date SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))DATEDIFF возвращает целое число дней до или после 1900-1-1, и преобразование Datetime услужливо возвращает его к этой дате в полночь.
поскольку DateDiff возвращает целое число, вы можете использовать сложение или вычитание дней, чтобы получить правильное смещение.
SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)Это не округление, это усек...Но я думаю, что именно об этом и спрашивают. (Чтобы округлить добавить один и усечь...и это не округление либо, что потолок, но опять же скорее всего то, что вы хотите. Чтобы действительно круглый добавить .5 (это работает?) и усечь.
оказывается, вы можете добавить .5 to GetDate () и он работает так, как ожидалось.
-- Round Current time to midnight today or midnight tomorrow SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))Я сделал все мои испытания на SQL Server 2008, но я думаю, что эти функции применяются и к 2005 году.
-- -- SQL DATEDIFF getting midnight time parts -- SELECT GETDATE() AS Now, Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) AS MidnightToday, Convert(DateTime, DATEDIFF(DAY, -1, GETDATE())) AS MidnightNextDay, Convert(DateTime, DATEDIFF(DAY, 1, GETDATE())) AS MidnightYesterDay go Now MidnightToday MidnightNextDay MidnightYesterDay -------------------- --------------------- --------------------- --------------------- 8/27/2014 4:30:22 PM 8/27/2014 12:00:00 AM 8/28/2014 12:00:00 AM 8/26/2014 12:00:00 AM
SELECT getdate()результат: 2012-12-14 16:03:33.360
SELECT convert(datetime,convert(bigint, getdate()))результат 2012-12-15 00:00:00.000
как упоминал @ BassamMehanni, вы можете использовать дату в SQL Server 2008 и далее...
SELECT * FROM yourTable WHERE dateField >= CAST(GetDate() - 6 AS DATE) AND dateField < CAST(GetDate() + 1 AS DATE)второе условие, на самом деле может быть просто
GetDate(), но я показываю этот формат в качестве примераLess Than DateXчтобы избежать необходимости приведения поля даты к дате, а также, таким образом, значительно повысить производительность.
если вы находитесь на 2005 или ниже, вы можете использовать это...
SELECT * FROM yourTable WHERE dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0) AND dateField < DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)
попробуйте использовать эту.
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
Это может выглядеть дешево, но это работает для меня
выберите конвертировать (DATETIME, LEFT (CONVERT(VARCHAR,@dateFieldOrVariable,101),10)+' 00:00:00.000')
Я обычно делаю
SELECT * FROM MyTable WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)Если вы используете SQL SERVER 2008, Вы можете сделать
SELECT * FROM MyTable WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)надеюсь, что это помогает
Comments