Почему функция Datediff показывает разные значения?
Когда я выполняю следующий запрос, я получаю разные результаты.
SELECT Datediff(year, 0, Getdate());
Результат был 115
Когда я использую это, я получаю следующий результат:
SELECT Datediff(year, 1900, Getdate());
Результат составил 110
Собственно, в SQL Server это займет от 1900-01-01
, но почему они показывают разные значения?
Ответы
Ответ 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());;