Почему DATEDIFF возвращает -1 - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь понять, как работает функция DATEDIFF в SQL Server.Следующий T-SQL возвращает -1:

SELECT DATEDIFF(MONTH, 2015-10-25, 2015-12-27)

Тем не менее, end_date идет после start_date, поэтому я ожидал бы положительное число, а не отрицательное число.Кроме того, я ожидаю, что разница между 25 октября и 27 декабря составит 2 месяца.Вместо этого SQL Server возвращает -1 месяц.Может кто-нибудь объяснить, что происходит?

Ответы [ 4 ]

5 голосов
/ 15 мая 2019

Вы не цитируете свои даты, это означает, что ваше выражение оценивается как:

SELECT DATEDIFF(MONTH, 1980, 1976)

Что после неявного преобразования в datetime равно:

SELECT DATEDIFF(MONTH, '1905-06-04 00:00:00.000', '1905-05-31 00:00:00.000')

Итак, начальная дата послеКонечная дата.

5 голосов
/ 15 мая 2019

Вам не хватает апострофов:

SELECT  2015-10-25 AS First, 
        2015-12-27 AS Second,
        CAST(2015-10-25 As DateTime) AS [First as datetime],
        CAST(2015-12-27 As DateTime) AS [Second as datetime],
        DATEDIFF(MONTH, 2015-10-25, 2015-12-27) AS WrongResult,
        DATEDIFF(MONTH, '2015-10-25', '2015-12-27') AS CorrectResult

Результаты:

First   Second  First as datetime       Second as datetime      WrongResult CorrectResult
1980    1976    04.06.1905 00:00:00     31.05.1905 00:00:00     -1          2

SQL Server смотрит на 2015-10-25 как int - результат математического выражения (1980).
Использование int в datetime функциях заставляет SQL Server неявно преобразовывать значение int в значение DateTime.
Значение int представляет количество дней, прошедшее с '1900-01-01' - и поскольку второй аргумент приводит к меньшему значению int, вы получаете отрицательное число.

Как писал в своем комментарии Йерун Мостерт: «Гоча за книги».

2 голосов
/ 15 мая 2019

Поскольку вы используете числа (в частности, целые числа), а не строки.2015-10-25 = 1980, который при конвертации в дату равен '1905-06-04'.С другой стороны 2015-12-27 = 1976, что в качестве даты '1905-05-31'.Поскольку '1905-05-31' за месяц до '1905-06-04', вы получите результат -1.

Используйте буквенные строки и yyyyMMdd даты:

SELECT DATEDIFF(MONTH, '20151025', '20151227');
1 голос
/ 15 мая 2019

Поместите значения даты в одинарные кавычки.

Запрос

SELECT DATEDIFF(MONTH, '2015-10-25', '2015-12-27');

Этот запрос возвращает 2 в качестве вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...