Mere
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?
143
3
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 fastT
som afgrænser mellem dato- og tidsdelen af dinDATETIME
.Dette er gyldigt for SQL Server 2000 og nyere.
Så i dit konkrete tilfælde - brug disse strenge:
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 almindeligDATETIME
) og din nuværendeINSERT
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.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.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).
Enkelt svar - 5 er italiensk "yy" og 105 er italiensk "yyyy". Derfor:
vil fungere korrekt, men
vil give fejl.
Ligeledes,
vil give fejl, hvor som
vil fungere.