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).
你不应该做第二和第三种选择是有充分理由的.首先考虑一下:
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中引入.