Округление 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)
597   8  

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

    Ничего не найдено.