Konvertering mislyktes ved konvertering av dato og/eller klokkeslett fra tegnstreng ved innsetting av datetime

Jeg prøvde å opprette en tabell som følger,

create table table1(date1 datetime,date2 datetime);

Først prøvde jeg å sette inn verdier som nedenfor,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

Det har gitt feilmelding,

Kan ikke konvertere varchar til datetime.

Så prøvde jeg formatet nedenfor som et av innleggene som ble foreslått av vår stackoverflow,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

Men jeg får fortsatt feilmeldingen,

Konvertering mislyktes ved konvertering av dato og/eller klokkeslett fra tegnstreng.

Har du noen forslag?

Løsning

Det finnes mange formater som støttes av SQL Server - se MSDN Books Online on CAST and CONVERT. De fleste av disse formatene er avhengige av hvilke innstillinger du har - derfor kan disse innstillingene fungere noen ganger - og noen ganger ikke.

Måten å løse dette på er å bruke det (litt tilpassede) ISO-8601 datoformatet som støttes av SQL Server - dette formatet fungerer alltid - uavhengig av SQL Server-språk og datoformatinnstillinger.

ISO-8601-formatet støttes av SQL Server og finnes i to varianter:

  • ÅÅÅÅÅMMDD for bare datoer (ingen tidsdel); merk her: ingen bindestreker!, det er veldig viktig! ÅÅÅÅÅÅ-MM-DD er IKKE uavhengig av datoformatinnstillingene i SQL Server og vil IKKE fungere i alle situasjoner!

eller:

  • ÅÅÅÅÅ-MM-DDTHH:MM:SS for datoer og klokkeslett - merk her: dette formatet har bindestreker (men de kan utelates), og en fast T som skilletegn mellom dato- og tidsdelen av DATETIME.

Dette gjelder for SQL Server 2000 og nyere.

Så i ditt konkrete tilfelle - bruk disse strengene:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

så skal det gå bra (merk: du må bruke det internasjonale 24-timers formatet i stedet for 12-timers AM/PM-formatet for dette).

Alternativt: Hvis du bruker SQL Server 2008 eller nyere, kan du også bruke datatypen DATETIME2 (i stedet for vanlig DATETIME), og din nåværende INSERT vil bare fungere uten problemer! :-) DATETIME2 er mye bedre og mye mindre kresen på konverteringer - og det er uansett den anbefalte datatypen for SQL Server 2008 eller nyere.

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  

Ikke spør meg hvorfor hele dette temaet er så vanskelig og litt forvirrende - det er bare slik det er. Men med formatet ÅÅÅÅÅMMDD bør det gå bra for alle versjoner av SQL Server og for alle språk- og datoformatinnstillinger i SQL Server.

Kommentarer (3)

Noen ganger mislykkes konverteringen i SQL Server ikke på grunn av dato- eller tidsformatene som brukes, men fordi du prøver å lagre feil data som ikke er akseptable for systemet.

Et eksempel:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

SQL-serveren vil gi følgende feilmelding:

`Konvertering mislyktes ved konvertering av dato og/eller klokkeslett fra tegnstreng.

Årsaken til denne feilen er ganske enkelt at det ikke finnes noen slik dato (29. februar) i år (2015).

Kommentarer (2)

Enkelt svar - 5 er italiensk "yy" og 105 er italiensk "yyyy". Det er derfor:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

vil fungere korrekt, men

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

vil gi feil.

På samme måte,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

vil gi feil, mens

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

vil fungere.

Kommentarer (0)