2015-06-30 13 views
23

Wenn ich folgende Abfrage ausführe, bekomme ich unterschiedliche Ergebnisse.Warum zeigt die Daediff-Funktion unterschiedliche Werte?

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

Das Ergebnis wurde 115

Als ich diese verwenden, erhalte ich ein anderes Ergebnis:

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

Das Ergebnis war 110

es tatsächlich in SQL Server wird von 1900-01-01 nehmen, aber warum zeigen diese unterschiedliche Werte?

+3

, wenn Sie 1900 '1900' wird sich ändern Sie das gleiche Ergebnis wie Ihr erstes Beispiel erhalten - '1900' wird intern als 1900-01-01 getauscht –

Antwort

23

diese versuchen, die Logik zu erklären:

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

Eine ganze Zahl als die Anzahl der Tage interpretiert wird seit 1900-01-01 während ein String-Wert wie ‚1900‘ wird als Datumsformat interpretiert werden.

1900 Tage vom 1. Januar 1900 ist 1905-03-16, das ist fünf Jahre von 1900 und in 110 Jahren (2015).

15

Dies liegt daran, dass wenn Sie 0 als DatumZeit eingeben, 1900 als Jahrteil zurückgibt, während 1900 als DatumZeit zurückgegeben 1905 als Jahrteil zurückgibt.

Demo

Von MSDN:

Werte mit dem Datentyp Datetime werden intern von Microsoft SQL Server als zwei 4-Byte-Integer gespeichert. Die ersten 4 Bytes speichern die Anzahl der Tage vor oder nach dem Basisdatum, 1. Januar 1900. Das Basisdatum ist das Systemreferenzdatum.

Das heißt, das Gießen der wörtlichen 0-datetime entspricht den Datetime-Wert für 0 Tage nach dem 1.1.1900 zu bekommen, was 1.1.1900 ist. In ähnlicher Weise für 1900. Daher, wie @MartinSmith in den Kommentaren hervorhebt, entspricht Ihre Berechnung SELECT Datediff(year,dateadd(d,0,'1/1/1900'), Getdate()), die wie erwartet 115 zurückgibt.

Möglicherweise ist zu beachten, dass die MSDN-Seite für Cast und Convert dieses Szenario nicht speziell abdeckt, d. H. int bis datetime.

+4

Fehlende Erklärung, dass die Umwandlung von int in datetime genauso funktioniert wie 'DATUMADD (TAG' bis' 1900-01-01' –

+0

@MartinSmith Einverstanden. Versuch zu jagen von MSDN, wenn es etwas Bestimmtes gibt um den 0-Wert. Kannst du mich bitte darauf hinweisen? –

+0

Kann nicht im Thema "CAST" erwähnt werden. Das Basisdatum vom 1. Januar 1900 für die Binärdarstellung wird hier erwähnt https://technet.microsoft.com/en-us/library/aa258277(v=sql.80).aspx –

3

Die von Ihnen angegebene Nummer wird als Tage hinzugefügt, was zu dem Unterschied führte.

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

Result1 ist 1900 Result2 ist 1905.

Also mit ihnen ist gleich:

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());; 
Verwandte Themen