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?
143
3
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 fastT
som skilletegn mellom dato- og tidsdelen avDATETIME
.Dette gjelder for SQL Server 2000 og nyere.
Så i ditt konkrete tilfelle - bruk disse strengene:
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 vanligDATETIME
), og din nåværendeINSERT
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.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.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).
Enkelt svar - 5 er italiensk "yy" og 105 er italiensk "yyyy". Det er derfor:
vil fungere korrekt, men
vil gi feil.
På samme måte,
vil gi feil, mens
vil fungere.