2013-08-26 18 views
11

Serwer: SQL Server 2012; SP1; Developer EditionDodaj datę i godzinę

Kod:

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

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

select @datetime + @time 

Kiedy uruchomić powyższy kod w bazie danych MASTER, pojawia się błąd:

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

Ale kiedy to każda inna baza danych, to działa! Każdy pomysł, dlaczego tak się dzieje?

P.S. - W wersji Enterprise powoduje to błąd niezależnie od kontekstu bazy danych.

+1

znalazłem ten Przydatny link http://beyondrelational.com/modules/2/blogs/77/Posts/18855/0239-sql-server-2012-msg-402-the-data-types-datetime i-time-are-incompatible-in-the-addsubtract-op.aspx –

+0

możliwy duplikat [TSQL do dodania pola datetime z polem czasu] (http://stackoverflow.com/questions/15228132/tsql-to- add-datetime-field-with-a-time-field) –

+0

Dzięki Ajay, za link informacyjny! Ciekawi mnie tylko, dlaczego nadal musi działać w wersji Developer Developer 2012. Pół upieczonego wypieku? :-) – tejaslakade

Odpowiedz

3

Faktycznie, nie ma racjonalnego zachowania podczas dodawania datę i czas, chyba Znasz strefy czasowe dla obu wartości. Inne bazy danych mogą przyjmować pewną dowolną domyślną strefę czasową, ale SQL Server tego nie robi.

Gdyby projektanci T-SQL dodali takie wsparcie, większość starego kodu (zarówno po stronie serwera, jak i po stronie klienta) pękłaby z trudnymi do wykrycia błędami. Pamiętaj, że większość ludzi nadal używa starego typu datetime, zakładając domyślną strefę czasową (lokalną lub GMT).

Można argumentować, że dodanie datetimeoffset i czas powinno być możliwe, ponieważ pierwsza zawiera informacje o czasową, a drugi nie, ale myślę, że T-SQL projektant chciał, aby uniknąć nieporozumień podczas konwersji jednego datatype do drugiego. Wiele kodu po stronie klienta nadal by się zepsuło, chyba że ludzie zmieniliby kod ze świadomością strefy czasowej po stronie klienta.

Dlaczego więc brak wyraźnej funkcji, która powoduje dodanie? Prawdopodobnie też by nie działało, ponieważ typy datetime bez strefy czasowej są konwertowane niejawnie na datetimeoffset2. Można łatwo przekazać wartość bez strefy czasowej do takiej funkcji i zostanie ona przekonwertowana do niewłaściwej strefy czasowej PRZED jej przekazaniu do funkcji

Krótko mówiąc, zgodność wsteczna nie zapewnia bezpiecznego sposobu obsługi daty i czasu dodawania.

5

Powyższy kod będzie działał z MS SqlServer 2008, ale ten kod nie będzie działał z MS SqlServer 2012 lub nowszym. Napotkałem ten sam problem i rozwiązałem go w ten sposób.

DECLARE @today_start datetime 
DECLARE @dail_time time 

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