2013-03-22 6 views
7

Ist die Beziehung zwischen DATETIME & INTEGER und DATE & INTEGER konsistent?Warum kann Ganzzahl von DATETIME subtrahiert werden, aber nicht vom Typ DATE

Dies führt fein:

DECLARE @Yesterday DATETIME = GETDATE(); 
SELECT @Yesterday-1; 

Wie dies tut:

DECLARE @Yesterday DATE = GETDATE(); 
SELECT @Yesterday; 

Diese Fehler:

DECLARE @Yesterday DATE = GETDATE(); 
SELECT @Yesterday-1; 

ich sicher ein integer Typ von einem datetime aber nicht von einem subtrahieren kann date.
Was ist der Grund für dieses Verhalten?

+7

Die implizite Umwandlung von 'int' zu' datetime' geht zurück auf Sybase Tage. Ich denke, für die neuen Datentypen haben sie sich entschieden, dies nicht als mögliche Ursache für Bugs zu tun (versehentliches Einfügen von Integer-Werten in eine "datetime" -Spalte und keine Benachrichtigung über das Problem). Eine verwandte Connect Item-Anforderung, die sich über implizite Conversions beschwert [Hinzufügen optionaler Checks für eine robustere Entwicklung] (http://connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=260762) –

+0

@MartinSmith updated - vielen Dank für die Information – whytheq

+0

@MartinSmith - hast du gewählt zu schließen? Wer auch immer getan hat, hat keinen Kommentar hinterlassen; schön, einen Kommentar zu sehen, da es die Möglichkeit gibt, das OP – whytheq

Antwort

7

Eigentlich ist es sehr konsistent. DATETIME ist ein Typ, der von früheren Versionen von SQL Server übernommen wurde. Seit der Ausgabe 2008 wurde DATETIME2 eingeführt, und die Möglichkeit, ganze Zahlen zu addieren/subtrahieren, wurde entfernt. Sie können es immer noch auf DATETIME als Vermächtnis tun.

DATE, wie DATETIME2 war schon seit 2008, und für diese Art ist das Hinzufügen/Subtrahieren von Zahlen auch verboten.

Dadurch erhalten Sie einen Fehler:

DECLARE @Yesterday DATETIME2 = GETDATE(); 
SELECT @Yesterday-1; 

So fein :) ist alles.

+1

+1 Danke für die Info - Ich war nicht bewusst 'DATETIME2' – whytheq

1

dies könnte also besser sein:

declare @Yesterday DATE = DATEADD(d, -1, getdate()) 
select @Yesterday 
+0

- +1 vielen Dank für die Info - es gibt viele Problemumgehungen - Ich frage mich nur" Warum?" – whytheq

Verwandte Themen