2015-06-30 11 views
23

Kiedy wykonuję następujące zapytanie otrzymuję różne wyniki.Dlaczego funkcja Datingiff pokazuje różne wartości?

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

Wynik był 115

Kiedy używam tego, otrzymuję inny wynik:

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

Wynik był 110

Właściwie w SQL Server to zajmie od 1900-01-01, ale dlaczego te pokazują różne wartości?

+3

jeśli zmienisz 1900 „1900” pojawi się ten sam wynik jako pierwszy przykład - '1900' będzie odlewane wewnętrznie jako 1900-01-01 –

Odpowiedz

23

Spróbuj wyjaśnić logikę:

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

całkowita jest interpretowany jako liczba dni od 1900-01-01 natomiast wartość ciągu, takich jak „1900” będzie interpretowany jako format daty.

1900 dni od 1 stycznia 1900 roku to 1905-03-16, czyli pięć lat od 1900 i 110 lat od teraz (2015).

15

Dzieje się tak, ponieważ jeśli wyrzucisz 0 jako datę, zwraca 1900 jako część roku, a 1900 jako datę/rok zwraca 1905 jako część roku.

Demo

Od MSDN:

wartości z typu danych datetime są przechowywane wewnętrznie przez Microsoft SQL Server jako dwóch liczb 4-bajtowych. Pierwsze 4 bajty przechowują liczbę dni przed lub po dacie bazowej, 1 stycznia 1900. Datą bazową jest systemowa data odniesienia.

Oznacza to, rzucając dosłowne 0 do datetime jest równoważna uzyskanie wartości datetime 0 dni po 1/1/1900, który jest 01/01/1900. Podobnie jak w 1900. Dlatego, jak zaznacza @MartinSmith w komentarzach, twoje obliczenia są równoważne z SELECT Datediff(year,dateadd(d,0,'1/1/1900'), Getdate()), która zwraca 115 zgodnie z oczekiwaniami.

Być może warto zauważyć, że strona MSDN na temat przesyłania i konwersji nie obejmuje w szczególności tego scenariusza, tj. int do datetime.

+4

Brakujące wyjaśnienie, że rzucanie int do datetime efektywnie działa tak samo jak 'DATEADD (DAY' na' 1900-01-01' –

+0

@MartinSmith Agreed. z MSDN, jeśli jest coś konkretnego o wartości 0. Czy możesz wskazać mi to? –

+0

Nie można tego zobaczyć w temacie "CAST". Data bazowa 1 stycznia 1900 r. Dla binarnej reprezentacji jest tu wymieniona https://technet.microsoft.com/en-us/library/aa258277(v=sql.80).aspx –

3

Podana liczba zostanie dodana jako liczba dni, która spowodowała różnicę.

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

wynik1 wynosi 1900 wynik2 jest 1905.

więc korzystanie z nich jest równa:

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());; 
Powiązane problemy