Странная проблема сравнения даты и времени с датой 2 миллисекунды - PullRequest
0 голосов
/ 26 июня 2018

Я столкнулся с типичной проблемой сравнения с датой и временем2. Я не могу понять, почему в 1 и 2 не возвращает равный результат. Я читал о том, как значение datetime хранится в 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 голосов
/ 26 июня 2018

Проблема заключается в том, что 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

0 голосов
/ 26 июня 2018

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, поэтому значение в вашем примере не будет совпадать при сравнении двух представлений.

...