我一直在使用SQL Server中的datetime列。现在大多数时候我必须将datetime的时间部分重置为'00:00:00.000'。
我使用cast函数来实现相同的效果:
select cast(cast(getdate() as date)as datetime)
现在我的其他一些团队成员使用其他功能:
select cast(floor(cast(GETDATE() as float))as datetime)
或
SELECT CONVERT(VARCHAR,GETDATE(),105)
我应该使用哪个函数来记住索引列是一个日期时间类型的列。(因此我使用两次强制转换来转换datetime -> date -> datetime)。
有很好的理由说明为什么不应该使用第二和第三个选项。首先考虑这个:
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中引入。