2015-06-30 4 views
23

Когда я выполняю следующий запрос, я получаю разные результаты.Почему функция Datediff показывает разные значения?

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

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

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

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

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

На самом деле в SQL Server это возьмут от 1900-01-01, но почему они показывают разные значения?

+3

, если вы измените 1900 на '1900', вы получите тот же результат, как ваш первый пример - '1900' будет внутренне отбрасываться как 1900-01-01 –

ответ

23

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

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

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

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

15

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

Demo

От MSDN:

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

Это означает, отбрасывая буквальное 0 до 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.

+4

Отсутствует объяснение, что литье int в datetime эффективно работает так же, как 'DATEADD (DAY' to' 1900-01-01' –

+0

@MartinSmith Согласен. Попытка выследить из MSDN, если есть что-то конкретное bout значение 0. Можете ли вы указать мне на это? –

+0

Невозможно увидеть это в теме 'CAST'. Базовая дата 1 января 1900 года для двоичного представления упоминается здесь https://technet.microsoft.com/en-us/library/aa258277(v=sql.80).aspx –

3

Число, которое вы указали, будет добавлено в качестве дней, которые привели к разнице.

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

Result1 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());; 
Смежные вопросы