如何获取不带时间部分的当前日期


Answers:


119

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

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

关于StackOverflow的两个不同而出色的答案证明了这一点:

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方法并不安全。

这里的其他答案指出,您永远不会将其应用于列。这是正确的,但是您可能要选择10万行或添加计算列或GROUPBY dateonly。然后,您必须使用此方法。

另一个答案也提到了样式110。这不是语言或SET DATEFORMAT安全的语言,并且以“英国”语言设置失败。请参阅 Tibor Karaszi撰写的有关日期时间数据类型的最终指南


1
提供的链接无效。
Viswanathan Iyer

6

您必须将其转换为指定格式格式的varchar(在这种情况下为110),然后转换(或强制转换)为日期时间。

select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.