【问题标题】:Cast vs Convert SQL Server转换与转换 SQL Server
【发布时间】:2015-08-04 19:27:14
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

您有充分的理由不应该选择第二个和第三个选项。首先考虑一下:

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

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

下一步:

SELECT CONVERT(VARCHAR,GETDATE(),105)

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

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

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

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

但是等等,为什么要通过字符串的中间结构呢?你第一个建议的版本比较简单。

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

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

【讨论】:

  • 感谢 Gordon...抽出时间并给出详细的解释... :) 真的很感激!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2010-10-16
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多