У меня небольшая проблема с моим SQL-запросом. Я использую функцию GETDATE, однако, скажем, я выполняю сценарий в 17:00, он будет извлекать записи с 17.12.2011 до 17.12.2011. Как сделать так, чтобы он подтягивал записи за весь 12.12.2011 - 18.12.2011 в основном игнорирует время.
Мой сценарий:
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate > (GETDATE()-6)
sql
sql-server
sql-server-2005
getdate
Генриарон
источник
источник
Вот самое простое, что я нашел
-- 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)
Это не округление, это усечение ... Но я думаю, что это то, о чем спрашивают. (Чтобы округлить, добавьте единицу и усеките ... и это тоже не округление, это потолок, но опять же, скорее всего, что вы хотите. Чтобы действительно округлить, добавьте 0,5 (это работает?) И усеките.
Оказывается, вы можете добавить 0,5 в GetDate (), и он работает должным образом.
-- Round Current time to midnight today or midnight tomorrow SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))
Я провел все свои испытания на SQL Server 2008, но думаю, что эти функции применимы и к 2005 году.
источник
where [ScanDate] >= convert(datetime, datediff(day, 0, getdate())) and [ScanDate] < convert(datetime, datediff(day, -1, getdate()))
-- -- 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, вы можете использовать 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)
источник
Попробуйте использовать это.
источник
Это может показаться дешевым, но у меня это работает
источник
Вы можете преобразовать datetime в дату, а затем обратно в datetime. Это сбросит метку времени.
источник
Я обычно делаю
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)
Надеюсь это поможет
источник
Вы можете округлить время.
Использование
ROUND
ниже приведет к округлению до полуночи.источник