SQL Server podporuje mnoho formátů – viz MSDN Books Online o CAST a CONVERT. Většina těchto formátů je závislá na tom, jaká máte nastavení – proto mohou tato nastavení někdy fungovat – a někdy ne.
Způsob, jak to vyřešit, je použít (mírně upravený) formát data ISO-8601 který je podporován SQL Serverem – tento formát funguje vždy - bez ohledu na váš jazyk SQL Server a nastavení formátu data.
Formát ISO-8601 je podporován serverem SQL Server ve dvou variantách:
YYYYMMDD
pouze pro data (žádná časová část); poznámka zde:žádné pomlčky! , to je velmi důležité!YYYY-MM-DD
je NE nezávisle na nastavení formátu data na vašem serveru SQL a NE pracovat ve všech situacích!
nebo:
YYYY-MM-DDTHH:MM:SS
pro data a časy – poznámka zde:tento formát má pomlčky (ale mohou být vynechán) a pevnéT
jako oddělovač mezi datem a časem vašehoDATETIME
.
Toto platí pro SQL Server 2000 a novější.
Takže ve vašem konkrétním případě - použijte tyto řetězce:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
a měli byste být v pořádku (poznámka:musíte použít mezinárodní 24hodin spíše než 12hodinový formát AM/PM).
Alternativně :pokud používáte SQL Server 2008 nebo novější, můžete také použít DATETIME2
datový typ (místo prostého DATETIME
) a váš aktuální INSERT
fungovalo by to bez problémů! :-) DATETIME2
je mnohem lepší a mnohem méně náročný na převody – a každopádně jde o doporučené datové typy data/času pro SQL Server 2008 nebo novější.
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
Neptejte se mě, proč je celé toto téma tak ošemetné a poněkud matoucí – tak to prostě je. Ale s YYYYMMDD
formátu, měli byste být v pořádku pro jakoukoli verzi SQL Server a pro jakékoli nastavení jazyka a formátu data na vašem serveru SQL.