2013-08-26 14 views
11

Server: SQL Server 2012; SP1; Developer EditionAggiungi data e ora

Codice:

declare @datetime datetime = '1900-01-01 00:00:00.000' 

declare @time time = '11:11:11' 

select @datetime + @time 

Quando eseguo il codice di cui sopra nel database MASTER, ottengo l'errore:

Msg 402, Level 16, State 1, Line 3 The data types datetime and time are incompatible in the add operator.

Ma quando si tratta di qualsiasi altro database, funziona! Qualche idea sul perché questo debba accadere?

P.S. - Nell'edizione aziendale, questo genera un errore indipendentemente dal contesto del database.

+1

ho trovato questo link utile http://beyondrelational.com/modules/2/blogs/77/Posts/18855/0239-sql-server-2012-msg-402-the-data-types-datetime -e-time-are-incompatible-in-the-addsubtract-op.aspx –

+0

possibile duplicato di [TSQL per aggiungere un campo datetime con un campo time] (http://stackoverflow.com/questions/15228132/tsql-to- add-datetime-field-with-a-time-field) –

+0

Grazie Ajay, per il link informativo! Sono solo curioso di sapere perché deve ancora essere in esecuzione nella versione Developer 2012. Metà cottura al forno? :-) – tejaslakade

risposta

3

In realtà, non v'è alcun comportamento razionale quando si aggiunge una data e un tempo, a meno che non si conoscono i fusi orari per entrambi valori. Altri database possono assumere un fuso orario predefinito arbitrario ma SQL Server no.

Se i progettisti T-SQL avessero aggiunto tale supporto, la maggior parte del vecchio codice (sia lato server che lato client) si romperebbe con errori difficili da rilevare. Ricorda, la maggior parte delle persone usa ancora il vecchio tipo datetime, assumendo un certo fuso orario predefinito (locale o GMT).

si potrebbe sostenere che l'aggiunta di un datetimeoffset e tempo dovrebbe essere possibile, perché il primo contiene informazioni fuso orario e la seconda non lo fa, ma credo che il progettista T-SQL voleva evitare confusione durante la conversione di uno datatype all'altro. Un sacco di codice sul lato client si romperebbe ancora, a meno che le persone non cambiassero il loro codice sensibile al fuso orario dei tipi di client.

Quindi, perché nessuna funzione esplicita fa l'aggiunta? Probabilmente non funzionerebbe neanche, poiché i tipi datetime senza fuso orario vengono convertiti implicitamente in datetimeoffset2. Si potrebbe facilmente passare un valore senza fuso orario a tale funzione e verrebbe convertito nel fuso orario errato PRIMA che sia passato alla funzione

In breve, la compatibilità all'indietro non fornisce un modo sicuro di gestire l'aggiunta di data e ora.

5

Il codice sopra funzionerà con MS SqlServer 2008 ma questo codice non funzionerà con MS SqlServer 2012 o successivo. Ho riscontrato lo stesso problema e lo risolvo in questo modo.

DECLARE @today_start datetime 
DECLARE @dail_time time 

SELECT @today_start = convert(datetime, @dayStr,103) + CAST(@dail_time as DATETIME)