将比较日期时间和datetime2值导致奇怪的行为,比较浮点数和双打数据的方式?

时间:2014-05-30 14:43:27

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

我的公司正在准备现有产品的从零开始的新版本,我们正在进行的一项更改是从SQL Server 2005切换到2008.我们目前正在尝试决定是否应该从{切换对于包含日期和列表的列,{1}}到datetime时间信息。

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

显然,如果他们试图在我们的数据库的datetime2列中存储来自我们数据库的精度太高的datetime2,那么我们冒着投射错误的风险,但我们也想知道是否存在错误比较问题。在许多编程语言中,比较floats to doubles的行为有点不直观;在将datetime值与datetime值进行比较时会出现类似的问题吗?

2 个答案:

答案 0 :(得分:0)

我不是这方面的专家,但我只是快速选择,看看他们是否会恢复平等......

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没有抓住这个,我想知道这是否会产生影响。

答案 1 :(得分:0)

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

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

结果: Results

您可以看到在某些情况下通过将datetime转换为datetime2来提高精度会给我们带来非零的伪影。这样一来,在datetime2datetime之间,相等性检查将不会始终正确进行。