转换vs转换SQL Server

时间:2015-05-22 17:11:02

标签: sql datetime casting sql-server-2012 type-conversion

我一直在使用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)

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

1 个答案:

答案 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中引入。