2013-03-22 3 views
7

La relazione tra DATETIME & INTEGER e DATA & INTEGER è coerente?Perché il numero intero può essere sottratto da DATETIME ma non il tipo DATE

Esegue bene:

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

Come fa questo:

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

Questo errori:

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

posso sottrarre in modo sicuro un tipo integer da un datetime ma non da un date.
Qual è il motivo di questo comportamento?

+7

Il cast implicito da 'int' a' DateTime' risale ai giorni di Sybase. Credo che per i nuovi tipi di dati hanno deciso di non farlo come una possibile causa di bug (inserendo accidentalmente valori interi in una colonna 'datetime' e non essendo avvisati del problema). Una richiesta relativa all'elemento Connect si è lamentata delle conversioni implicite [Aggiungi controlli facoltativi per uno sviluppo più affidabile] (http://connect.microsoft.com/SQL/feedback/ViewFeedback.aspx?FeedbackID=260762) –

+0

@MartinSmith upped - grazie per informazioni – whytheq

+0

@ MartinSmith - hai votato per chiudere? chi ha fatto non ha lasciato alcun commento; bello vedere un commento in quanto dà la possibilità di modificare l'OP – whytheq

risposta

7

In realtà, è molto coerente. DATETIME è un tipo ereditato dalle precedenti edizioni di SQL Server. Dall'edizione 2008 è stato introdotto DATETIME2 e la possibilità di aggiungere/sottrarre interi. Puoi ancora farlo su DATETIME come eredità.

DATE, come DATETIME2 era in circolazione dal 2008, e per questo tipo è anche vietato aggiungere/sottrarre numeri.

Questo vi dà un errore:

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

Così bene :) di tutto.

+1

+1 grazie per informazioni - Non ero a conoscenza di 'DATETIME2' – whytheq

1

Quindi questo potrebbe essere migliore:

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

- +1 grazie per informazioni - ci sono un sacco di soluzioni alternative - Mi chiedevo solo" perché?" – whytheq