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

Округление SQL DateTime до полуночи

У меня возникла небольшая проблема с моим SQL-запросом. Я использую функцию GETDATE, однако, допустим, я выполняю script в 5 вечера, он будет вытягивать записи между 12/12/2011 5 вечера до 12/18/2011 5 вечера. Как я могу заставить его затягивать записи всего целого 12/12/2011 - 12/18/2011 в основном игнорировать время.

Мой script:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate > (GETDATE()-6)  
4b9b3361

Ответ 1

В 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)

Ответ 2

Вот самая простая вещь, которую я нашел

-- Midnight floor of current date

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))

DATEDIFF возвращает целое число дней до или после 1900-1-1, и Convert Datetime обязуется вернуть его к этой дате в полночь.

Так как DateDiff возвращает целое число, вы можете использовать дни добавления или вычитания для получения правильного смещения.

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)

Это не округление, это усечение... Но я думаю, что это то, что задают. (Чтобы закруглить, добавить один и усечь... и что не округлять, то потолок, но снова скорее всего, что вы хотите. Чтобы действительно раунд добавить .5 (это работает?) И усекать.

Оказывается, вы можете добавить .5 в GetDate(), и он работает как ожидалось.

-- Round Current time to midnight today or midnight tomorrow

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))

Я выполнил все мои испытания на SQL Server 2008, но я думаю, что эти функции относятся и к 2005 году.

Ответ 3

--
-- 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 

Ответ 4

SELECT getdate()

Результат: 2012-12-14 16: 03: 33.360

SELECT convert(datetime,convert(bigint, getdate()))

Результат 2012-12-15 00: 00: 00.000

Ответ 5

Как отметил @BassamMehanni, вы можете использовать DATE в SQL Server 2008 и далее...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= CAST(GetDate() - 6 AS DATE)
  AND dateField <  CAST(GetDate() + 1 AS DATE)

Вторым условием может быть только GetDate(), но я показываю этот формат в качестве примера Less Than DateX, чтобы избежать необходимости использовать DateField для DATE, тем самым значительно улучшая производительность.


Если вы в 2005 году или ниже, вы можете использовать это...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0)
  AND dateField <  DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)

Ответ 6

Попробуйте использовать это.

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())

Ответ 7

Это может показаться дешевым, но оно работает для меня

SELECT CONVERT (DATETIME, LEFT (CONVERT (VARCHAR, @dateFieldOrVariable, 101), 10) + '00: 00: 00.000')

Ответ 8

Я обычно делаю

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)

Надеюсь, что это поможет

Ответ 9

Вы можете сократить время.

Использование ROUND ниже приведет к округлению до полуночи.

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >  CONVERT(datetime, (ROUND(convert(float, getdate()-6.5),0)))