Konverteringen mislykkedes ved konvertering af dato og/eller klokkeslæt fra en tegnstreng under indsættelse af datetime

Jeg forsøgte at oprette en tabel som følger,

create table table1(date1 datetime,date2 datetime);

Først prøvede jeg at indsætte værdier som nedenfor,

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

Det har givet fejl, der siger,

Kan ikke konvertere varchar til datetime

Så prøvede jeg nedenstående format som en af de indlæg, der blev foreslået af vores 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 stadig fejlen, der siger,

Konvertering mislykkedes ved konvertering af dato og/eller tid fra tegnstreng

Nogen forslag?

Løsning

Der er mange formater, der understøttes af SQL Server - se MSDN Books Online on CAST and CONVERT. De fleste af disse formater er afhængige af hvilke indstillinger du har - derfor kan disse indstillinger måske virke nogle gange - og nogle gange ikke.

Måden at løse dette på er at bruge det (let tilpassede) ISO-8601 datoformat, som understøttes af SQL Server - dette format virker altid - uanset dit SQL Server sprog og dine indstillinger for datoformat.

Det ISO-8601-format, der understøttes af SQL Server, findes i to varianter:

  • YYYYYYYMMDD for datoer alene (ingen tidsdel); bemærk her: ingen bindestreger!, det er meget vigtigt! YYYYYYY-MM-DD er IKKE uafhængig af datoformatindstillingerne i din SQL Server og vil IKKE virke i alle situationer!

eller:

  • YYYYYY-MM-DDTHH:MM:SS for datoer og tidspunkter - bemærk her: dette format har bindestreger (men de kan udelades), og et fast T som afgrænser mellem dato- og tidsdelen af din DATETIME.

Dette er gyldigt for SQL Server 2000 og nyere.

Så i dit konkrete tilfælde - brug disse strenge:

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

og du burde være i orden (bemærk: du skal bruge det internationale 24-timers format i stedet for 12-timers AM/PM-formatet).

Alternativt: Hvis du er på SQL Server 2008 eller nyere, kan du også bruge datatypen DATETIME2 (i stedet for almindelig DATETIME) og din nuværende INSERT ville bare virke uden problemer! :-) DATETIME2 er meget bedre og meget mindre kræsen med konverteringer - og det er alligevel den anbefalede dato/tid datatype 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  

Don't spørge mig hvorfor hele dette emne er så tricky og lidt forvirrende - det's bare den måde det er. Men med YYYYYYMMDD-formatet burde du være fint for enhver version af SQL Server og for enhver sprog- og datoformatindstilling i din SQL Server.

Kommentarer (3)

Konverteringen i SQL Server mislykkes nogle gange ikke på grund af de anvendte dato- eller tidsformater, men blot fordi du forsøger at gemme forkerte data, der ikke er acceptable for systemet.

Eksempel:

Det er ikke et system, der ikke kan accepteres af det samme: Create Table MyTable (MyDate);

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

SQL-serveren vil give følgende fejl:

Serveren slår følgende fejl: Conversion failed when convert date and/or time from character string.

Årsagen til denne fejl er simpelthen, at der ikke findes en sådan dato (Feb-29) i år (2015).

Kommentarer (2)

Enkelt svar - 5 er italiensk "yy" og 105 er italiensk "yyyy". 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 give fejl.

Ligeledes,

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

vil give fejl, hvor som

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

vil fungere.

Kommentarer (0)