我的公司正在准备现有产品的从零开始的新版本,我们正在进行的一项更改是从SQL Server 2005切换到2008.我们目前正在尝试决定是否应该从{切换对于包含日期和列表的列,{1}}到datetime
时间信息。
我们知道(强烈)推荐datetime2
,但我们的一些客户拥有他们自己的SQL Server数据库(版本未知),他们与我们产品的数据库并排运行,他们有时从中提取数据我们的数据库用于自己的数据库操作。
显然,如果他们试图在我们的数据库的datetime2
列中存储来自我们数据库的精度太高的datetime2
,那么我们冒着投射错误的风险,但我们也想知道是否存在错误比较问题。在许多编程语言中,比较floats to doubles的行为有点不直观;在将datetime
值与datetime
值进行比较时会出现类似的问题吗?
答案 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
您可以看到在某些情况下通过将datetime
转换为datetime2
来提高精度会给我们带来非零的伪影。这样一来,在datetime2
和datetime
之间,相等性检查将不会始终正确进行。