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.
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" –