转换vs转换SQL Server

Shu*_*ham 3 sql datetime casting type-conversion sql-server-2012

我一直在使用SQL Server中的datetime列.现在大多数时候我必须将日期时间的时间部分重置为'00:00:00.000'.

我使用cast函数来实现相同的目的:

select cast(cast(getdate() as date)as datetime)
Run Code Online (Sandbox Code Playgroud)

现在我的其他团队成员使用其他功能:

select cast(floor(cast(GETDATE() as float))as datetime)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT CONVERT(VARCHAR,GETDATE(),105)
Run Code Online (Sandbox Code Playgroud)

我应该记住哪个函数要记住索引列是日期时间类型列.(因此我使用强制转换两次转换datetime - > date - > datetime).

Gor*_*off 7

你不应该做第二和第三种选择是有充分理由的.首先考虑一下:

select cast(floor(cast(GETDATE() as float)) as datetime)
Run Code Online (Sandbox Code Playgroud)

我的问题是,虽然它确实有效,但我找不到指定行为的文档.内部格式不是浮点数; 它是两个整数,所以我发现从日期/时间到浮点数非常不优雅.可能存在危险的情况.

下一个:

SELECT CONVERT(VARCHAR,GETDATE(),105)
Run Code Online (Sandbox Code Playgroud)

这个版本...Arggh!它varchar()没有长度参数.坏习惯.不要那样做!等待发生这是一个令人困惑的问题.那么,让我们考虑一下:

SELECT CONVERT(VARCHAR(10), GETDATE(), 105)
Run Code Online (Sandbox Code Playgroud)

如果你想要一个字符串,这很好,但结果与你的其他查询不同.等效声明是:

SELECT CONVERT(DATE, CONVERT(VARCHAR(10), GETDATE(), 105), 105)
Run Code Online (Sandbox Code Playgroud)

但是等等,为什么要经历一个字符串的中间结构?您首先提出的版本更简单.

唯一的缺点是它与2008之前版本的SQL Server不兼容.如果你需要与早期版本兼容,那么我会去寻找令人讨厌的东西:

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)

这将计算自虚拟"0"日期以来的天数,然后将其添加回来.如果你不介意打字,以下几乎是一样的:

SELECT DATEADD(day, DATEDIFF(day, '1900-01-01', GETDATE()), '1900-01-01')
Run Code Online (Sandbox Code Playgroud)

或者通过中间字符串值.

SQL Server为此功能提供了多种解决方法的原因是因为该功能非常有用,但date日期类型仅在SQL Server 2008中引入.