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

希望这可以帮助