аномалия datediff и dateadd

в чем разница между следующими двумя логическими условиями (оба значения CreationDate являются DateTime)?

   and abs(datediff(hour, a.CreationDate, e.CreationDate)) < 12

и:

   and e.CreationDate > dateadd(hour, -12, a.CreationDate)
   and e.CreationDate < dateadd(hour,  12, a.CreationDate)

(да, есть разница - изменение дает разные результаты, но я не вижу, что)

фон

недавно вопрос возник на мета.se о значках "куратор" и 12-часовых окнах редактирования. Этот вопрос вдохновил меня сделать копию SQL-запроса, который я ранее написано, и сделать новую копию" переменной " размером окна редактирования, а не только 12 часов с каждой стороны. По сути, я изменил следующий код:

   and abs(datediff(hour, a.CreationDate, e.CreationDate)) < 12

для:

   and e.CreationDate > dateadd(hour, -12, a.CreationDate)
   and e.CreationDate < dateadd(hour,  12, a.CreationDate)

(за исключением 12 значений во втором операторе являются переменными).

эти два запроса находятся в Обозревателе данных Stack Exchange:оригинал и скопировал

запросы дают немного разные результаты, хотя... и я действительно чешу голова, Почему. Я также не могу решить, какой результат запроса правильный. Я считаю, что это должно сводиться к чему-то в логике datediff... это "круглые" часы или что-то еще, так что у него немного меньше результатов?

DateDiff:

enter image description here

функция dateadd:

enter image description here

1 ответов


DateDiff пунктам пересечения границы, а DateAdd делает простую арифметику.

например, первый запрос будет считать 12 границ между 00:59 и 12:01, и, таким образом, исключил бы эту разницу, но второй запрос посчитал бы ее в течение 12 часов. Это делает второй запрос "правильным", а первый - "неправильным".