Cast 与 Convert SQL 服务器

Cast vs Convert SQL Server

我一直在使用 SQL 服务器中的日期时间列。现在大多数时候我必须将日期时间的时间部分重置为“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)

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

您有充分的理由不应该执行第二个和第三个选项。首先考虑这个:

select cast(floor(cast(GETDATE() as float)) as datetime)

我的问题是,虽然它确实有效,但我找不到指定行为的文档。内部格式不是浮点数;它是两个整数,所以我觉得从 date/time 到浮点数很不雅观。可能存在危险的情况。

下一个:

SELECT CONVERT(VARCHAR,GETDATE(),105)

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

SELECT CONVERT(VARCHAR(10), GETDATE(), 105)

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

SELECT CONVERT(DATE, CONVERT(VARCHAR(10), GETDATE(), 105), 105)

等等,为什么要经过字符串的中间结构?您最初提出的版本更简单。

唯一的缺点是它与 SQL 服务器的 2008 之前版本不兼容。如果您需要与早期版本兼容,那么我会选择讨厌的:

SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)

这会计算自虚构的“0”日期以来的天数,然后将它们加回去。如果你不介意打字,下面的内容几乎是一样的:

SELECT DATEADD(day, DATEDIFF(day, '1900-01-01', GETDATE()), '1900-01-01')

或通过中间字符串值。

SQLServer 之所以有几个解决此功能的方法是因为该功能非常有用,但 date 日期类型仅在 SQLServer 2008 中引入。