如何在没有时间部分的情况下获取当前日期

问题描述

如果您必须遍历记录集并且在 sql Server 2008 中没有日期,则最快

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)

Varchar 转换是最糟糕的方法之一。当然,对于一个价值来说,这可能并不重要,但这是一个养成的好习惯。

这种方式也是确定性的,比如说如果你想索引一个计算列。即使是写 sql Server 书籍的人也会被日期时间转换所困扰

这种技术也是可扩展的。

  • 昨天:DATEADD(day, DATEDIFF(day, 0, GETDATE()), -1)
  • 月初:DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
  • 上月底:DATEADD(month, DATEDIFF(month, 0, GETDATE()), -1)
  • 下个月开始:DATEADD(month, DATEDIFF(month, 0, GETDATE()), 31)

编辑:

正如我提到的确定性,varchar 方法是不安全的,除非您使用样式 112。

此处的其他答案指出,您永远不会将其应用于列。这是正确的,但您可能希望选择 100k 行或添加计算列或 GROUP BY dateonly。然后你必须使用这个方法

一个答案还提到了样式 110。这不是语言或 SET DATEFORMAT 安全的,并且因“英国”语言设置而失败。

解决方法

在 SQL Server 2005 中,如何获取没有时间部分的当前日期?我一直在使用GETDATE(),但希望它的时间为 00:00:00.0