Подтвердить что ты не робот

Почему функция Datediff показывает разные значения?

Когда я выполняю следующий запрос, я получаю разные результаты.

SELECT Datediff(year, 0, Getdate());

Результат был 115

Когда я использую это, я получаю следующий результат:

SELECT Datediff(year, 1900, Getdate());

Результат составил 110

Собственно, в SQL Server это займет от 1900-01-01, но почему они показывают разные значения?

4b9b3361

Ответ 1

Попробуйте объяснить логику:

select cast(0 as datetime)
select cast(1 as datetime)

Целое число интерпретируется как количество дней с 1900-01-01, тогда как строковое значение, такое как "1900", будет интерпретироваться как формат даты.

1900 Дней с 1 января 1900 года - 1905-03-16, что составляет пять лет с 1900 года и до 110 лет (2015 год).

Ответ 2

Это связано с тем, что если вы отбрасываете 0 в качестве даты и времени, он возвращает 1900 в качестве части года, тогда как 1900, отличная от даты, возвращает 1905 в качестве части года.

Демо

От MSDN:

Значения с типом данных даты и времени хранятся внутри Microsoft SQL Server в виде двух 4-байтовых целых чисел. Первые 4 байта хранят количество дней до или после базовой даты, 1 января 1900 года. Базовая дата - это контрольная дата системы.

Это означает, что листинг литерала от 0 до datetime эквивалентен получению значения datetime за 0 дней после 1/1/1900, что составляет 1/1/1900. Аналогично для 1900. Поэтому, как отмечает @MartinSmith в комментариях, ваш расчет эквивалентен SELECT Datediff(year,dateadd(d,0,'1/1/1900'), Getdate()), который возвращает 115, как ожидалось.

Возможно, стоит отметить, что страница MSDN на Cast и Convert не охватывает этот сценарий, т.е. int до datetime.

Ответ 3

Указанный вами номер будет добавлен в качестве дней, в результате которых возникнет разница.

Select DATEADD(dd,0,0)
Select DATEADD(dd,1900,0)

Результат 1 - 1900 Результат 2 - 1905.

Поэтому использование их равно:

SELECT Datediff(year,0, Getdate()) = SELECT Datediff(year,DATEADD(dd,0,0), Getdate());

SELECT Datediff(year,1900, Getdate()) = SELECT Datediff(year,DATEADD(dd,1900,0), Getdate());;