Округление SQL DateTime до полуночи - PullRequest
68 голосов
/ 19 декабря 2011

У меня небольшая проблема с моим запросом SQL. Я использую функцию GETDATE, однако, скажем, я выполняю сценарий в 5 вечера, он будет получать записи в период с 12.12.2011 17.00 до 18.09.2011 5 вечера. Как я могу заставить его подтягивать записи за весь период 12.12.2011 - 18.12.2011 в основном игнорировать время.

Мой скрипт:

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

Ответы [ 8 ]

98 голосов
/ 19 декабря 2011

В 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)
45 голосов
/ 21 июня 2012

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

-- Midnight floor of current date

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

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

Поскольку 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 году.

7 голосов
/ 28 августа 2014
--
-- 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 голосов
/ 18 декабря 2012
SELECT getdate()

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

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

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

3 голосов
/ 07 мая 2014

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

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
3 голосов
/ 19 декабря 2011

Как уже упоминалось @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)
1 голос
/ 18 января 2017

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

ВЫБРАТЬ КОНВЕРТ (DATETIME, LEFT (CONVERT (VARCHAR, @ dateFieldOrVariable, 101), 10) + '00: 00: 00.000')

0 голосов
/ 19 декабря 2011

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

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)

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

...