问题描述
如果您必须遍历记录集并且在 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