Istnieje wiele formatów obsługiwanych przez SQL Server — zobacz MSDN Books Online na temat CAST i CONVERT. Większość z tych formatów jest zależna jakie masz ustawienia — dlatego te ustawienia mogą czasami działać — a czasami nie.
Sposobem na rozwiązanie tego jest użycie (nieznacznie dostosowanego) formatu daty ISO-8601 który jest obsługiwany przez SQL Server - ten format działa zawsze - niezależnie od ustawień języka SQL Server i formatu daty.
Format ISO-8601 obsługiwany przez SQL Server jest dostępny w dwóch wersjach:
YYYYMMDD
tylko dla dat (bez czasu); uwaga tutaj:bez myślników! , to bardzo ważne!YYYY-MM-DD
jest NIE niezależnie od ustawień formatu daty na serwerze SQL Server i NIE pracuj we wszystkich sytuacjach!
lub:
YYYY-MM-DDTHH:MM:SS
dla dat i godzin – uwaga tutaj:ten format ma myślniki (ale mogą należy pominąć) i stałeT
jako ogranicznik między częścią daty i godziny wDATETIME
.
Dotyczy to SQL Server 2000 i nowszych.
Więc w twoim konkretnym przypadku - użyj tych ciągów:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
i powinno być dobrze (uwaga:musisz użyć międzynarodowego 24-godzinnego w tym przypadku zamiast 12-godzinnego formatu AM/PM).
Alternatywnie :jeśli korzystasz z SQL Server 2008 lub nowszy, możesz również użyć DATETIME2
typ danych (zamiast zwykłego DATETIME
) i aktualne INSERT
po prostu działałby bez żadnych problemów! :-) DATETIME2
jest o wiele lepszy i mniej wybredny w przypadku konwersji - i tak jest to zalecane typy danych daty/godziny dla SQL Server 2008 lub nowszego.
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
Nie pytaj mnie, dlaczego cały ten temat jest tak zawiły i nieco zagmatwany – tak po prostu jest. Ale z YYYYMMDD
format, powinieneś być w porządku dla dowolnej wersji SQL Server oraz dla dowolnego języka i ustawienia formatu daty w twoim SQL Server.