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

Pie*_*ers 89 sql-server-2005 sql-server

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

gbn*_*gbn 127

最快的,如果你有遍历一个记录,并且没有日期在SQL Server 2008

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)

StackOverflow 上的两个不同且出色的答案证明了这一点:One , Two

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)

编辑:

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

此处的其他答案指出您永远不会将其应用于列。这是正确的,但您可能希望选择 100k 行或添加计算列或仅按日期分组。那你就得用这个方法了。

另一个答案还提到了样式 110。这不是语言或 SET DATEFORMAT 安全的,并且因“英国”语言设置而失败。请参阅Tibor Karaszi的 datetime 数据类型最终指南


mrd*_*nny 7

您必须将其转换为 varchar 指定格式模式(在本例中为 110),然后转换(或转换)回日期时间。

select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)
Run Code Online (Sandbox Code Playgroud)