将SQL DateTime舍入到午夜

时间:2011-12-18 22:24:57

标签: sql sql-server sql-server-2005 getdate

我的SQL查询遇到了一个小问题。我正在使用GETDATE函数,但是,假设我在下午5点执行脚本,它将在2011年12月12日下午5点至2011年12月18日下午5点之间提取记录。如何使整个整个12/12/2011 - 12/18/2011的记录基本上忽略时间。

我的剧本:

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

10 个答案:

答案 0 :(得分:98)

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

答案 1 :(得分:44)

这是我发现的最简单的事情

-- 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年。

答案 2 :(得分:7)

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

答案 3 :(得分:4)

SELECT getdate()

结果:2012-12-14 16:03:33.360

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

结果2012-12-15 00:00:00.000

答案 4 :(得分:3)

正如@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的示例,以避免必须将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)

答案 5 :(得分:3)

尝试使用它。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())

答案 6 :(得分:1)

这可能看起来很便宜但它适合我

  

SELECT CONVERT(DATETIME,LEFT(CONVERT(VARCHAR,@ dateFieldOrVariable,101),10)+&#39; 00:00:00.000&#39;)

答案 7 :(得分:1)

您可以将日期时间转换为日期,然后再转换回日期时间。这将重置时间戳。

select getdate() --2020-05-05 13:53:35.863

select cast(cast(GETDATE() as date) as datetime) --2020-05-05 00:00:00.000

答案 8 :(得分:0)

我经常做

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 :(得分:0)

您可以舍入时间。

使用下面的val list = List((1,('a',4)),(2,('b',3)),(1,('c',2)),(2,('d',1))) val rdd = sc.parallelize(list) rdd.reduceByKey((rec1,rec2) => if(rec1._2 > rec2._2) rec2 else rec1).foreach(println) 会将其四舍五入到午夜。

ROUND