我一直在使用SQL Server中的datetime列。现在大多数时候我必须将日期时间的时间部分重置为'00:00:00.000'。
我使用cast函数来实现相同的目的:
select cast(cast(getdate() as date)as datetime)
现在,我的其他团队成员也使用其他功能:
select cast(floor(cast(GETDATE() as float))as datetime)
OR
SELECT CONVERT(VARCHAR,GETDATE(),105)
我应该记住哪个函数要记住索引列是日期时间类型列。 (因此我使用强制转换两次转换日期时间 - >日期 - >日期时间。)
答案 0 :(得分:7)
有很好的理由说明你不应该做第二和第三种选择。首先考虑一下:
select cast(floor(cast(GETDATE() as float)) as datetime)
我的问题在于,尽管它确实有效,但我找不到指定行为的文档。内部格式不是浮点数;它是两个整数,所以我发现从日期/时间到浮点数非常不优雅。可能存在危险的情况。
下一步:
SELECT CONVERT(VARCHAR,GETDATE(),105)
此版本。 。 。 Arggh!它有varchar()
没有长度参数。坏习惯。不要那样做!等待发生这是一个令人困惑的问题。所以,让我们考虑一下:
SELECT CONVERT(VARCHAR(10), GETDATE(), 105)
如果你想要一个字符串,这很好,但结果与你的其他查询不同。等效声明是:
SELECT CONVERT(DATE, CONVERT(VARCHAR(10), GETDATE(), 105), 105)
但是等等,为什么要通过字符串的中间结构?您首先提出的版本更简单。
唯一的缺点是它与2008之前版本的SQL Server不兼容。如果你需要与早期版本兼容,那么我会去寻找令人讨厌的事情:
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
这会计算自虚拟“0”日期以来的天数,然后将其添加回来。如果您不介意打字,以下几乎是一样的:
SELECT DATEADD(day, DATEDIFF(day, '1900-01-01', GETDATE()), '1900-01-01')
或通过中间字符串值。
SQL Server为此功能提供了多种解决方法的原因是因为该功能非常有用,但date
日期类型仅在SQL Server 2008中引入。