2012-12-28 10 views
8

Zawsze używam tego kodu do konwersji na datetime:SQL Server problem konwersji z datetime

DECLARE @a datetime 
SET @a= CONVERT(datetime,'2012-12-28 14:04:43') 
print @a 

Ale to już nie działa! Próbowałem nawet ponownym uruchomieniu programu SQL Server, ale problem pozostaje:

Conversion error

Błąd w obrazie jest w języku włoskim. W języku angielskim powinno być:

Konwersja typu danych char do datetime spowodowało datetime wartości, która jest poza zakresem dozwolonych wartości.

+0

Czy ostatnio zmieniłeś domyślny język logowania na włoski? Wpływa to na 'DATEFORMAT' oraz sposób analizowania dat. Jeśli zrobisz "SET LANGUAGE english", twój kod działa poprawnie, ale kończy się niepowodzeniem w ramach opcji "SET LANGUAGE italian" –

Odpowiedz

15

Istnieje wiele formatów obsługiwanych przez SQL Server - patrz MSDN Books Online on CAST and CONVERT. Większość z tych formatów to zależnych od zależnie od ustawień - dlatego te ustawienia mogą działać czasem - a czasami nie.

Sposobem rozwiązania tego problemu jest użycie (nieco dostosowany) ISO-8601 format daty, który jest obsługiwany przez SQL Server - działa ten format zawsze - niezależnie od ustawień językowych i dateformat SQL Server.

ISO-8601 format jest obsługiwany przez SQL Server jest dostępny w dwóch smakach:

  • YYYYMMDD tylko dla dat (bez części czasu); zanotuj tutaj: bez kreski!, to bardzo ważne! YYYY-MM-DD jest NOT niezależnie od ustawień daty w twoim Serwerze SQL i będzie działać w każdej sytuacji!

czyli

  • YYYY-MM-DDTHH:MM:SS dla dat i czasów - uwaga tutaj: ten format ma kreski (ale może zostać pominięte) oraz stałą T jako separatora pomiędzy datą i godziną część twojego DATETIME.

Dotyczy to programów SQL Server 2000 i nowszych.

Jeśli używasz SQL Server 2008 lub nowszy i DATE typ danych (tylko DATE - nieDATETIME!), możesz rzeczywiście użyć formatu YYYY-MM-DD, który również będzie działał z dowolnymi ustawieniami w twoim Serwerze SQL.

Nie pytaj mnie, dlaczego ten cały temat jest tak trudny i nieco zagmatwany - tak po prostu jest. Ale z formatem YYYYMMDD powinieneś być w porządku dla każdej wersji SQL Server oraz dla dowolnego języka i ustawienia daty w twoim Serwerze SQL.

więc w konkretnym przypadku - użyj tego:

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28T14:04:43') 
print @a 

i to powinno działać na wszelkie instalacje SQL Server, z dowolny ustawień językowych i format daty.

Jeśli prowadzisz swój oryginalny kod języku angielskim - będzie działać dobrze:

SET LANGUAGE English 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

Dec 28 2012 2:04PM 

ale jeśli używasz włoski (lub niemiecki lub brytyjski lub francuski) w swoim języku, to nie bo formacie bezT w środku ciąg daty/czasu nie jest niezależny od języka, a nie „bezpieczny”:

SET LANGUAGE Italian 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

Msg 242, Level 16, State 3, wiersz 4
La conversione di un tipo di Dati varchar w datetime ha generato un valore non compreso nell'intervallo dei Valori consentiti.

4

Próbujesz przekonwertować ciąg na datetime. Problem dotyczy części daty. Najlepszym sposobem jest uzyskanie ciągu daty na ISO format (yyyymmdd), a następnie konwersję. Spróbuj tego;

DECLARE @a datetime 
SET @a= CONVERT(datetime,replace('2012-12-28 14:04:43', '-','')) 
print @a 
+0

Dziękujemy! to działa. Ale nie wiem, dlaczego mój kod działa na komputerze mojego przyjaciela. – GVillani82

+0

To może być jego lokalna kultura. – Kaf

0

Domyślam się, że domyślny format daty został zmieniony na komputerze. Dodaj specyfikację konwersji z powrotem w:

SET @a= CONVERT(datetime,'2012-12-28 14:04:43', 121) 
Powiązane problemy