【问题标题】:Will comparing datetime & datetime2 values result in odd behavior the way comparing floats to doubles does?比较 datetime 和 datetime2 值会像比较浮点数和双精度数那样导致奇怪的行为吗?
【发布时间】:2014-05-30 14:43:27
【问题描述】:

我的公司正在准备现有产品的全新版本,我们正在进行的更改之一是从 SQL Server 2005 切换到 2008。我们目前正在尝试决定是否应该从 @ 987654322@ 到 datetime2 用于保存日期和时间信息的列。

我们知道datetime2 是(强烈)推荐的,但我们的一些客户拥有自己的 SQL Server 数据库(版本未知),他们与我们产品的数据库并行运行,有时他们会从我们的数据库中提取数据与他们自己的数据库操作一起使用。

很明显,如果他们试图从我们的数据库中将精度过高的datetime2 存储在他们数据库的datetime 列中,我们就会冒着转换错误的风险,但我们也想知道比较是否可能存在问题。在许多编程语言中,比较floats to doubles 的行为有些不直观;将datetime 值与datetime2 值进行比较会出现类似问题吗?

【问题讨论】:

    标签: sql-server sql-server-2008 datetime


    【解决方案1】:

    我不是这方面的专家,但我只是进行了快速选择,看看他们是否会返回平等......

    SELECT 
      isEqual = CASE WHEN CONVERT(DATETIME2, GETDATE()) = CONVERT(DATETIME, GETDATE()) THEN 1 ELSE 0 END
      ,Date2 = CONVERT(DATETIME2, GETDATE())
      ,Date1 = CONVERT(DATETIME, GETDATE())
    

    我假设你会得到和我一样的结果,我的返回一个 1 所以它认为它们是相同的。这显然不是一门完美的科学,因为我发送的数字与延迟几毫秒的数字完全相同。虽然由于 DATETIME 没有捕捉到这一点,但我想知道这是否会有所作为。

    【讨论】:

    • 在更高版本的 SQL Server 中,将 datetime 转换为 datetime2 的规则发生了变化。现在有时会返回零。
    【解决方案2】:

    是的,它可以,due to a breaking change 在 SQL Server 2016 中:

    select cast('2020-08-11 14:50:50.123' as datetime2) AS DT2,
        cast('2020-08-11 14:50:50.123' as datetime) AS DT,
        cast(cast('2020-08-11 14:50:50.123' as datetime) as datetime2) AS ConvertedDT2,
        case when cast('2020-08-11 14:50:50.123' as datetime) = cast('2020-08-11 14:50:50.123' as datetime) then 1 else 0 end AS DateTimeEqualsDateTime,
        case when cast('2020-08-11 14:50:50.123' as datetime2) = cast('2020-08-11 14:50:50.123' as datetime2) then 1 else 0 end AS DateTime2EqualsDateTime2,
        case when cast('2020-08-11 14:50:50.123' as datetime2) = cast('2020-08-11 14:50:50.123' as datetime) then 1 else 0 end AS DateTime2EqualsDateTime,
        case when cast(cast('2020-08-11 14:50:50.123' as datetime) as datetime2) = cast('2020-08-11 14:50:50.123' as datetime2) then 1 else 0 end AS ConvertedDateTime2EqualsDateTime2
    

    结果:

    您可以看到在某些情况下,通过将 datetime 转换为 datetime2 来提高精度是如何给我们留下非零伪影的。这使得相等性检查在datetime2datetime 之间不会总是正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多