奇怪的 datetime 和 dateime2 毫秒比较问题
Weird datetime and dateime2 millisecond comparison issue
我一直面临 datetime 和 datime2 的典型比较问题。我无法理解为什么在 1 和 2 中 return 的结果不相等。我已经阅读了有关如何从 msdn 存储日期时间值以及基于 1 的日期时间值的信息 - 它应该 returned 等于 993 将四舍五入为 993 并与 99300000 进行比较
结果应该相等。我正在使用 SQL Server 2014。
如果有人有同样的想法,请告诉我。
1)
declare @dtest datetime2(7)
set @dtest = '2018-06-25 16:46:38.9930000'
declare @dtest1 datetime
set @dtest1 = '2018-06-25 16:46:38.993'
if @dtest < @dtest1
print 'datetime2 lesser'
2)
declare @dtest2 datetime2(7)
set @dtest2 = '2018-06-25 16:46:38.9970000'
declare @dtest3 datetime
set @dtest3 = '2018-06-25 16:46:38.997'
if @dtest2 > @dtest3
print 'datetime2 greater'
3)
declare @dtest4 datetime2(7)
set @dtest4 = '2018-06-25 16:46:38.9900000'
declare @dtest5 datetime
set @dtest5 = '2018-06-25 16:46:38.990'
if @dtest4 = @dtest5
print 'datetime2 and datetime equal'
datetime
和 datetime2
具有不同的内部存储格式和分辨率。
https://sqlfascination.com/2009/10/11/what-is-the-sql-server-2008-datetime2-internal-structure/
datetime2
每个时间单位使用 .0000001
秒(时间计数器的增量),而 datetime
使用 0.00333
秒
0.9970000
不能表示为 0.00333
的整数倍,因此在比较两种表示时,您的示例中的值将不匹配。
问题是 SQL 服务器正在隐式转换以进行比较并且正在更改值。显式转换为 Datetime,您应该会得到预期的结果。
这有助于显示导致意外结果的幕后情况:
declare @dt2 datetime2(7) = '2018-06-25 16:46:38.9930000'
declare @dt datetime
set @dt = @dt2
SELECT
@dt2 AS [Datetime2 value]
, @dt AS [Datetime value]
, CONVERT(DATETIME2,@dt) AS [Datetime converted to Datetime2]
, CONVERT(DATETIME2,@dt2) AS [Datetime2 converted to Datetime2]
, CONVERT(DATETIME,@dt) AS [Datetime converted to Datetime]
, CONVERT(DATETIME,@dt2) AS [Datetime2 converted to Datetime]
我一直面临 datetime 和 datime2 的典型比较问题。我无法理解为什么在 1 和 2 中 return 的结果不相等。我已经阅读了有关如何从 msdn 存储日期时间值以及基于 1 的日期时间值的信息 - 它应该 returned 等于 993 将四舍五入为 993 并与 99300000 进行比较 结果应该相等。我正在使用 SQL Server 2014。
如果有人有同样的想法,请告诉我。
1)
declare @dtest datetime2(7)
set @dtest = '2018-06-25 16:46:38.9930000'
declare @dtest1 datetime
set @dtest1 = '2018-06-25 16:46:38.993'
if @dtest < @dtest1
print 'datetime2 lesser'
2)
declare @dtest2 datetime2(7)
set @dtest2 = '2018-06-25 16:46:38.9970000'
declare @dtest3 datetime
set @dtest3 = '2018-06-25 16:46:38.997'
if @dtest2 > @dtest3
print 'datetime2 greater'
3)
declare @dtest4 datetime2(7)
set @dtest4 = '2018-06-25 16:46:38.9900000'
declare @dtest5 datetime
set @dtest5 = '2018-06-25 16:46:38.990'
if @dtest4 = @dtest5
print 'datetime2 and datetime equal'
datetime
和 datetime2
具有不同的内部存储格式和分辨率。
https://sqlfascination.com/2009/10/11/what-is-the-sql-server-2008-datetime2-internal-structure/
datetime2
每个时间单位使用 .0000001
秒(时间计数器的增量),而 datetime
使用 0.00333
秒
0.9970000
不能表示为 0.00333
的整数倍,因此在比较两种表示时,您的示例中的值将不匹配。
问题是 SQL 服务器正在隐式转换以进行比较并且正在更改值。显式转换为 Datetime,您应该会得到预期的结果。
这有助于显示导致意外结果的幕后情况:
declare @dt2 datetime2(7) = '2018-06-25 16:46:38.9930000'
declare @dt datetime
set @dt = @dt2
SELECT
@dt2 AS [Datetime2 value]
, @dt AS [Datetime value]
, CONVERT(DATETIME2,@dt) AS [Datetime converted to Datetime2]
, CONVERT(DATETIME2,@dt2) AS [Datetime2 converted to Datetime2]
, CONVERT(DATETIME,@dt) AS [Datetime converted to Datetime]
, CONVERT(DATETIME,@dt2) AS [Datetime2 converted to Datetime]