Sådan løses 'Konvertering mislykkedes, når konvertering af dato og / eller tid fra tegnstreng' -fejl?



Prøv Vores Instrument Til At Fjerne Problemer

Der er mange tilfælde, hvor datoer og tidspunkter ikke vises i det format, du vil have det, og heller ikke en forespørgselsoutput passer til seernes behov. Der er flere SQL Servers indbyggede funktioner til at formatere datostrengen efter dit behov, men for at strengen skal fortolkes af SQL Server, og for at undgå konverteringsfejl skal den være i et korrekt format. Når vi forsøger at konvertere dato eller tid fra tegnstreng, opstår der nogle gange følgende fejl. 'Konvertering mislykkedes ved konvertering af dato og / eller tid fra tegnstreng.'



fejl for datotidskonvertering

Figur 1: Fejl ved konvertering af dato og / eller tid fra tegnstrengen



Den ovennævnte fejl opstår normalt, når den bogstavelige dato ikke er korrekt og ikke kan konverteres fra strengen til DateTime eller date. Denne fejl skyldes en række årsager, som vi vil diskutere detaljeret sammen med løsningssættet.



Eksempel 1:

Storbritannien Dato og klokkeslæt viser datoen ved hjælp af formatet dag-måned-år (10. januar 2015 eller 10/1/2015), som vi kan opnå ved hjælp af SQL Server-indbygget funktion 'konvertere' med formatering 103.

Her i eksemplet nedenfor kan vi se, at den angivne datostreng er i det forkerte format. For det første giver det måneden, derefter dage og sidste år, som er forkert og ikke kan fortolkes af SQL Server, hvilket resulterer i en fejl. Det korrekte format til konvertering af britisk typedato ved hjælp af '103' datoformat er 'dd / mm / åååå'.

Forkert format:

Erklær @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'vælg CONVERT (datetime2, @date_time_value, 103) som UK_Date_Time_Style

Figur 2: Forkert datoformat, der resulterer i en fejl



Korrekt format:

Det britiske og franske datoformat er 103 = 'dd / mm / åååå' eller 3 = 'dd / mm / åå'. Her er 103 og 3 datoformater.

Erklær @date_time_value varchar (100) = '10 / 1/15 21:02:04 'vælg CONVERT (datetime2, @date_time_value, 103) som Date_Time_Style

Figur 3: Korrekt datoformat med 'dd / mm / åååå' britisk / fransk datostil

Erklær @date_time_value varchar (100) = '10 / 1/15 21:02:04 'vælg CONVERT (datetime2, @date_time_value, 3) som UK_Date_Time_Style

Figur 4: Korrekt datoformat med 'dd / mm / åå' britisk / fransk datostil

Eksempel 2:

Undertiden resulterer konvertering af streng til dato i SQL-server i en fejl, ikke på grund af de anvendte dato- eller tidsformater, snarere er det fordi du forsøger at gemme forkerte oplysninger, der ikke kan accepteres af ordningen.

Forkert dato:

Årsagen til følgende fejl er kun, at der i år 2019 ikke er nogen dato som '29. februar', fordi det ikke er et skudår.

Deklarer @date_time_value varchar (100) = '2019-02-29 21:02:04' vælg rollebesætning (@date_time_value som datetime2) som date_time_value

Figur 5: Fejl rejst, da 2019 ikke er et skudår, så det har ikke 29. februar som dato

Korrekt en:

Erklær @date_time_value varchar (100) = '2019-02-28 21:02:04' vælg cast (@date_time_value som datetime2) som date_time_value

Figur 6: Korrekt dato

ISO 8601 Datoformat:

Selvom der findes adskillige formater til manipulation af datoværdier, kan det være et brugervenligt problem at vælge en datetime-repræsentation, når man arbejder for en global / international masse. Så kulturspecifikke dato- / klokkeslæt bør undgås. Hvis vi betragter denne dato som '03/08/2018', fortolkes den på forskellige måder i forskellige regioner i verden.

  • I britisk stil fortolkes det som '8. marts 2018'
  • I europæisk stil fortolkes det som '3. august 2018'

Heldigvis er der et alternativ i det internationale datoformat udviklet af ISO. Den globale standard ISO 8601-format “ÅÅÅÅ-MM-DDThh: mm: ss” er en mere sproguafhængig mulighed for strengbogstaver, og den løser alle disse problemer. Mens 'åååå' er året, er 'mm' måned og 'dd' er dag. Så datoen '8. marts 2018' i internationalt ISO-format er skrevet som '2018-03-08'. Således er ISO-format det bedste valg til datorepræsentation.

Erklær @date_time_value varchar (100) = '2019-03-28 21:02:04' vælg konverter (datetime2, @ date_time_value, 126) som [åååå-mm-ddThh: mi: ss.mmm]

Figur 7: International standard ISO 8601 datoformat

Anbefalinger:

Forhåbentlig hjælper denne artikel med at lindre den forvirring, jeg ofte har set i samfundet om dato- / tidsværdier. Det anbefales imidlertid, at du aldrig gemmer datoer i teksttype (varchar, char, nvarchar, nchar eller tekst) Altid gem datoværdi i DATE, DATETIME og helst DATETIME2 (giver mere præcision) kolonner og efterlad datoinformationsformatering til brugergrænsefladelaget i stedet for at blive hentet fra databasen.

2 minutter læst