datetime和dateime2毫秒比较奇怪的问题

时间:2018-06-26 17:38:50

标签: sql sql-server datetime milliseconds datetime2

我一直在遇到典型的datetime和datime2比较问题。我无法理解为什么1和2中没有返回相等的结果。我已经读过有关如何从msdn存储日期时间值以及基于1的日期时间-它应该返回等于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'

2 个答案:

答案 0 :(得分:2)

问题是SQL Server隐式强制转换以进行比较,并且正在更改值。明确地转换为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]

enter image description here

答案 1 :(得分:0)

datetimedatetime2具有不同的内部存储格式和分辨率。

https://sqlfascination.com/2009/10/11/what-is-the-sql-server-2008-datetime2-internal-structure/

datetime2每个时间单位使用.0000001秒(计时器的增量),而datetime使用0.00333

0.9970000不能表示为0.00333的整数倍,因此,在两种表示形式之间进行比较时,示例中的值将不匹配。