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

#1 楼

如果必须遍历记录集并且在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安全的语言,并且设置为“ british”语言时失败。请参阅Tibor Karaszi关于日期时间数据类型的最终指南。

评论


提供的链接无效。

– Vishwanath Dalvi
18年7月25日在10:02

#2 楼

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

select getdate(), cast(convert(varchar(10), getdate(), 110) as datetime)