Neizdevās novērst reklāmguvumu, konvertējot datumu un / vai laiku no rakstzīmju virknes & rsquo; Kļūda?

Ir daudz gadījumu, kad datumi un laiki netiek parādīti vēlamajā formātā, kā arī vaicājumu izvade neatbilst skatītāju vajadzībām. Ir vairākas SQL Server iebūvētās funkcijas, lai formatētu datuma virkni atbilstoši jūsu vajadzībām, taču, lai virkne tiktu interpretēta SQL Server un lai izvairītos no konvertēšanas kļūdām, tai jābūt pareizā formātā. Mēģinot pārveidot datumu vai laiku no rakstzīmju virknes, dažkārt rodas kļūda. “Konvertēšana neizdevās, pārveidojot datumu un / vai laiku no rakstzīmju virknes.”

datuma un laika konvertēšanas kļūda

Iepriekš minētā kļūda parasti rodas, ja datuma literālis nav pareizs un to nevar pārveidot no virknes uz DateTime vai Date. Šī kļūda rodas vairāku iemeslu dēļ, kurus mēs detalizēti apspriedīsim kopā ar risinājumu kopu.

1. piemērs:

Apvienotā Karaliste Datuma un laika apzīmējumā datums tiek parādīts, izmantojot dienas-mēneša-gada formātu (2015. gada 10. janvāris vai 2015. gada 1. janvāris), kuru mēs varam sasniegt, izmantojot SQL Server iebūvētās funkcijas “pārveidot” funkciju ar 103. formatēšanas stilu.

Šeit zemāk esošajā piemērā mēs varam redzēt, ka norādītā datuma virkne ir nepareizā formātā. Pirmkārt, tas norāda mēnesi, pēc tam dienas un pagājušo gadu, kas ir nepareizi un ko SQL serveris nevar interpretēt, kā rezultātā rodas kļūda. Pareizais formāts Lielbritānijas stila datuma konvertēšanai, izmantojot “103” datuma stilu, ir “dd / mm / gggg”.

Nepareizs formāts:

Paziņot, ka @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'atlasiet CONVERT (datetime2, @date_time_value, 103) kā UK_Date_Time_Style

Pareizs formāts:

Lielbritānijas un Francijas datuma formāts ir 103 = “dd / mm / gggg” vai 3 = “dd / mm / ggg”. Šeit 103 un 3 ir datuma stili.

Paziņojiet, ka @date_time_value varchar (100) = '10 / 1/15 21:02:04 'atlasiet CONVERT (datetime2, @date_time_value, 103) kā Date_Time_Style
Paziņot, ka @date_time_value varchar (100) = '10 / 1/15 21:02:04 'atlasiet CONVERT (datetime2, @date_time_value, 3) kā UK_Date_Time_Style

2. piemērs:

Dažreiz virknes līdz datumam konvertēšana SQL serverī rada kļūdas, nevis izmantoto datuma vai laika formātu dēļ, drīzāk tāpēc, ka mēģināt saglabāt nepareizu informāciju, kas shēmai nav pieņemama.

Nepareizs datums:

Šīs kļūdas iemesls ir tikai tas, ka 2019. gadā nav tāda datuma kā “29. februāris”, jo tas nav lēciena gads.

Paziņot, ka @date_time_value varchar (100) = '2019-02-29 21:02:04' atlasiet cast (@date_time_value kā datetime2) kā date_time_value

Pareizais:

Paziņot, ka @date_time_value varchar (100) = '2019-02-28 21:02:04' atlasiet cast (@ date_time_value kā datetime2) kā date_time_value

ISO 8601 datuma formāts:

Lai gan manipulēšanai ar datuma vērtībām ir pieejami daudzi formāti, strādājot globālai / starptautiskai masai, datuma laika attēlojuma izvēle var būt izmantojamības problēma. Tāpēc jāizvairās no kultūrai raksturīgiem datuma / laika literāļiem. Ja mēs uzskatām šo datumu par “03/08/2018”, tas dažādos pasaules reģionos tiks interpretēts dažādi.

  • Lielbritānijas stilā tas tiek interpretēts kā “2018. gada 8. marts”
  • Eiropas stilā tas tiek interpretēts kā “2018. gada 3. augusts”

Par laimi, ISO izstrādātajā starptautiskajā datuma formātā ir viena alternatīva. Vispārējais standarta ISO 8601 formāts “GGGG-MM-DDThh: mm: ss” ir vairāk neatkarīgs no valodas virknes literāļu variants, un tas risina visas šīs problēmas. Tā kā “gggg” ir gads, “mm” ir mēnesis un “dd” ir diena. Tātad datums “2018. gada 8. marts” starptautiskā ISO formātā tiek rakstīts kā “2018-03-08”. Tādējādi ISO formāts ir labākā izvēle datuma attēlojumam.

Paziņot, ka @date_time_value varchar (100) = '2019-03-28 21:02:04' atlasiet konvertēšanu (datetime2, @ date_time_value, 126) kā [gggg-mm-ddThh: mi: ss.mmm]

Ieteikumi:

Cerams, ka šis raksts palīdzēs mazināt neskaidrības, ko bieži esmu redzējis sabiedrībā par datuma / laika vērtībām. Tomēr ieteicams nekad neglabāt datumus teksta tipā (varchar, char, nvarchar, nchar vai text) Vienmēr glabāt datuma vērtību DATE, DATETIME un vēlams DATETIME2 (nodrošina lielāku precizitāti) tipa kolonnās un atstāt datuma informācijas formatējumu lietotāja saskarnes slānim, nevis izgūt no datu bāzes.