Det finns många format som stöds av SQL Server - se MSDN Books Online om CAST och CONVERT. De flesta av dessa format är beroende på vilka inställningar du har - därför kan dessa inställningar fungera ibland - och ibland inte.
Sättet att lösa detta är att använda det (något anpassade) ISO-8601 datumformatet som stöds av SQL Server - det här formatet fungerar alltid - oavsett dina inställningar för SQL Server-språk och datumformat.
ISO-8601-formatet stöds av SQL Server finns i två varianter:
YYYYMMDD
för bara datum (ingen tidsdel); notera här:inga bindestreck! , det är väldigt viktigt!YYYY-MM-DD
är INTE oberoende av datumformatinställningarna i din SQL Server och kommer INTE fungera i alla situationer!
eller:
YYYY-MM-DDTHH:MM:SS
för datum och tider - notera här:detta format har bindestreck (men de kan utelämnas), och en fastT
som avgränsare mellan datum- och tidsdelen av dinDATETIME
.
Detta gäller för SQL Server 2000 och senare.
Så i ditt specifika fall - använd dessa strängar:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
och du borde klara dig (obs:du måste använda den internationella 24-timmars). format snarare än 12-timmars AM/PM-format för detta).
Alternativt :om du använder SQL Server 2008 eller nyare kan du också använda DATETIME2
datatyp (istället för vanlig DATETIME
) och din nuvarande INSERT
skulle bara fungera utan problem! :-) DATETIME2
är mycket bättre och mycket mindre kräsen när det gäller konverteringar - och det är de rekommenderade datatyperna för datum/tid för SQL Server 2008 eller senare i alla fall.
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
Fråga mig inte varför hela det här ämnet är så knepigt och lite förvirrande – det är bara så det är. Men med YYYYMMDD
format, bör du vara bra för alla versioner av SQL Server och för alla språk- och datumformatinställningar i din SQL Server.