将SQL DateTime舍入到午夜
我有一个小的问题,我的SQL查询。 我正在使用GETDATE函数,但是,假设我在5PM执行该脚本,它将在12/12/2011下午5点至2011年12月18日下午5点之间提取logging。 我怎么能把整个12/12/2011 – 12/18/2011的logging都拉上来,基本上忽略了时间。
我的脚本:
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate > (GETDATE()-6)
在SQL Server 2008和更新版本中,您可以将Date
时间转换为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)
这是我find的最简单的东西
-- Midnight floor of current date SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))
DATEDIFF返回1900-1-1之前或之后的整数天数,转换date时间会在午夜返回到该date。
由于DateDiff返回一个整数,所以可以使用加减天数来获得正确的偏移量。
SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)
这不是四舍五入的,但是我认为这是被问到的。 (要加一个和截断…而且不是四舍五入的,也就是天花板,但是再一次很可能是你想要的。真正的加一个.5(这是否工作?)和截断。
事实certificate,你可以将.5添加到GetDate(),并按预期工作。
-- Round Current time to midnight today or midnight tomorrow SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))
我在SQL Server 2008上做了所有的试验,但我认为这些function也适用于2005年。
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之后的date转换…
SELECT * FROM yourTable WHERE dateField >= CAST(GetDate() - 6 AS DATE) AND dateField < CAST(GetDate() + 1 AS DATE)
第二个条件实际上可以只是GetDate()
,但是我将这个格式作为Less Than DateX
一个例子来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)
尝试使用这个。
WHERE Orders.OrderStatus = 'Shipped' AND Orders.ShipDate >= CONVERT(DATE, 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 CONVERT(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)
希望这可以帮助