2013-08-26 23 views
11

Server: SQL Server 2012; SP1; Developer EditionDatum und Uhrzeit hinzufügen

Code:

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

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

select @datetime + @time 

Wenn ich den obigen Code in der Datenbank MASTER laufen, erhalte ich die Fehlermeldung:

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

Aber wenn es eine andere Datenbank, es funktioniert! Irgendeine Idee, warum das geschehen muss?

P.S. - In der Enterprise Edition wird unabhängig vom Datenbankkontext ein Fehler ausgegeben.

+1

ich diesen nützlichen Link gefunden http://beyondrelational.com/modules/2/blogs/77/Posts/18855/0239-sql-server-2012-msg-402-the-data-types-datetime -und-zeit-sind-inkompatibel-in-der-addsubtract-op.aspx –

+0

mögliches Duplikat von [TSQL zum Hinzufügen von Datum/Uhrzeit-Feld mit einem Zeitfeld] (http://stackoverflow.com/questions/15228132/tsql-to- add-datetime-field-with-a-time-Feld) –

+0

Danke Ajay, für den informativen Link! Ich bin nur neugierig, warum es in der 2012 Developer Edition noch laufen muss. Halb gebacken ausrollen? :-) – tejaslakade

Antwort

3

Eigentlich gibt es kein rationales Verhalten, wenn ein Datum und eine Zeit geben, es sei denn, kennen Sie die Zeitzonen für beiden Werte. Andere Datenbanken können eine willkürliche Standardzeitzone annehmen, SQL Server jedoch nicht.

Hätten die T-SQL-Designer eine solche Unterstützung hinzugefügt, würde der Großteil des alten Codes (sowohl auf der Server- als auch auf der Clientseite) mit der Erkennung von Fehlern behaftet sein. Denken Sie daran, dass die meisten Benutzer immer noch den alten Datetime-Typ verwenden und eine Standardzeitzone (lokal oder GMT) annehmen.

Man könnte argumentieren, dass das Hinzufügen einer Datetime und eine Zeit möglich sein sollte, da die erste Zeitzone Informationen enthält und die zweite nicht, aber ich denke, dass die T-SQL-Designer um Verwirrung vermeiden wollten, wenn man die Umwandlung Datentyp zum anderen. Eine Menge clientseitigen Code würde immer noch brechen, wenn die clientseitigen Typen ihren zeitzonenbewussten Code nicht ändern.

Also, warum keine explizite Funktion, die die Addition tut? Wahrscheinlich würde auch nicht funktionieren, da Datetime-Typen ohne Zeitzone implizit in datetimeoffset2 konvertiert werden. Sie könnten problemlos einen Wert ohne Zeitzone an eine solche Funktion übergeben, und es würde in die falsche Zeitzone konvertiert werden, BEVOR es an die Funktion übergeben wurde

Kurz gesagt, Rückwärtskompatibilität bietet keine sichere Möglichkeit, Datum und Uhrzeit zu verarbeiten.

5

Der obige Code funktioniert mit MS SqlServer 2008, aber dieser Code funktioniert nicht mit MS SqlServer 2012 oder höher. Ich bin auf dasselbe Problem gestoßen und löse es so.

DECLARE @today_start datetime 
DECLARE @dail_time time 

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