Istnieje wiele formatów obsługiwanych przez SQL Server - zobacz MSDN Books Online na temat CAST i CONVERT . Większość z tych formatów zależy od posiadanych ustawień - dlatego te ustawienia mogą czasami działać - a czasami nie.
Sposobem rozwiązania tego problemu 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 języka SQL Server i ustawień formatu daty .
Format ISO-8601 jest obsługiwany przez SQL Server w dwóch wersjach:
YYYYMMDD
tylko daty (bez części czasu); uwaga: bez myślników! , to bardzo ważne! NIEYYYY-MM-DD
jest niezależne od ustawień formatu daty w serwerze SQL i NIE będzie działać we wszystkich sytuacjach!
lub:
YYYY-MM-DDTHH:MM:SS
w przypadku dat i godzin - uwaga: ten format zawiera myślniki (ale można je pominąć) i ustalony T
separator między datą a godziną w pliku DATETIME
.
Dotyczy to SQL Server 2000 i nowszych.
Więc w swoim 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: w tym celu należy użyć międzynarodowego formatu 24-godzinnego zamiast 12-godzinnego formatu AM / PM).
Alternatywnie : jeśli korzystasz z SQL Server 2008 lub nowszego, możesz również użyć DATETIME2
typu danych (zamiast zwykłego DATETIME
), a Twój obecny INSERT
będzie działał bez żadnych problemów! :-) DATETIME2
jest o wiele lepszy i mniej wybredny pod względem konwersji - i tak jest to zalecane typy danych data / czas 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 pytajcie mnie, dlaczego cały ten temat jest taki podstępny i nieco zagmatwany - po prostu tak jest. Ale z YYYYMMDD
formatem powinno być w porządku dla każdej wersji SQL Server i dla dowolnego ustawienia języka i formatu daty w SQL Server.