У меня возникла небольшая проблема с моим 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)
Ответ 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)))