Kako popraviti napako »Pretvorba ni uspela pri pretvorbi datuma in / ali časa iz znakovnega niza«?



Preizkusite Naš Instrument Za Odpravo Težav

Veliko je primerov, ko se datumi in časi ne prikažejo v želeni obliki, niti izhodna poizvedba ne ustreza potrebam gledalcev. Obstaja več vgrajenih funkcij SQL Serverja, ki oblikujejo datumski niz glede na vaše potrebe, vendar mora SQL Server interpretirati niz in preprečiti napake pretvorbe v ustrezni obliki. Ko poskušamo datum ali uro pretvoriti iz znakovnega niza, se včasih pojavi naslednja napaka. 'Pretvorba ni uspela pri pretvorbi datuma in / ali časa iz znakovnega niza.'



napaka pretvorbe datuma in časa

Slika 1: Napaka pretvorbe datuma in / ali časa iz znakovnega niza



Zgoraj navedena napaka se ponavadi pojavi, če datumska dobesedna beseda ni pravilna in je ni mogoče pretvoriti iz niza v datumsko uro ali datum. Ta napaka je posledica številnih razlogov, o katerih bomo podrobno razpravljali skupaj z naborom rešitev.



Primer 1:

Združeno kraljestvo Zapis datuma in ure prikazuje datum v obliki dan-mesec-leto (10. januar 2015 ali 1. 1. 2015), kar lahko dosežemo s funkcijo »pretvorba« funkcije SQL Converted_in SQL Converter s slogom oblikovanja 103.

Tukaj v spodnjem primeru lahko vidimo, da je naveden datumski niz v napačni obliki. Najprej zagotavlja mesec, nato dni in zadnje leto, kar je napačno in ga SQL Server ne more razlagati, kar povzroči napako. Pravilna oblika za pretvorbo datuma v slogu Združenega kraljestva z uporabo sloga datuma »103« je »dd / mm / llll«.

Napačen format:

Prijavite @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'izberite CONVERT (datetime2, @date_time_value, 103) kot UK_Date_Time_Style

Slika 2: Napačna oblika datuma, ki povzroči napako



Pravilna oblika:

Britanska in francoska oblika datuma je 103 = 'dd / mm / llll' ali 3 = 'dd / mm / llll'. Tu sta 103 in 3 sloga datumov.

Navedite @date_time_value varchar (100) = '10 / 1/15 21:02:04 'izberite CONVERT (datetime2, @date_time_value, 103) kot Date_Time_Style

Slika 3: Pravilna oblika datuma z britanskim / francoskim slogom datuma »dd / mm / llll«

Prijavite @date_time_value varchar (100) = '10 / 1/15 21:02:04 'izberite CONVERT (datetime2, @date_time_value, 3) kot UK_Date_Time_Style

Slika 4: Pravilna oblika zapisa datuma z britanskim / francoskim slogom datuma 'dd / mm / ll'

2. primer:

Včasih pretvorba niza v datum v strežniku SQL povzroči napako, ne zaradi uporabljenih formatov datuma ali časa, temveč zato, ker poskušate shraniti napačne informacije, ki za shemo niso sprejemljive.

Napačen datum:

Razlog za naslednjo napako je zgolj v tem, da v letu 2019 ni datuma »29. februar«, ker ni prestopno leto.

Označi @date_time_value varchar (100) = '2019-02-29 21:02:04' izberite oddajo (@date_time_value kot datetime2) kot date_time_value

Slika 5: Napaka, ki izhaja, saj leto 2019 ni prestopno, zato nima datuma 29. februarja

Pravilno:

Označi @date_time_value varchar (100) = '2019-02-28 21:02:04' izberite cast (@date_time_value kot datetime2) kot date_time_value

Slika 6: Točen datum

Oblika datuma ISO 8601:

Čeprav so na voljo številni formati za manipulacijo z datumskimi vrednostmi, je pri izbiri predstavitve datuma in časa pri delu za globalno / mednarodno maso lahko težava uporabnosti. Zato se je treba izogibati literarnim datumom in času, specifičnim za kulturo. Če ta datum upoštevamo kot “3.8.2018”, ga bomo v različnih regijah sveta razlagali na različne načine.

  • V britanskem slogu se tolmači kot »8. marec 2018«
  • V evropskem slogu se tolmači kot »3. avgust 2018«

Na srečo obstaja ena alternativa v mednarodni obliki zapisa datuma, ki jo je razvil ISO. Globalni standardni format ISO 8601 »LLLL-MM-DDThh: mm: ss« je za jezikovne nikele bolj neodvisna možnost in obravnava vsa ta vprašanja. Medtem ko je 'llll' leto, 'mm' je mesec, 'dd' pa dan. Torej je datum »8. marec 2018« v mednarodnem formatu ISO zapisan kot »2018-03-08«. Tako je format ISO najboljša izbira za predstavitev datuma.

Označi @date_time_value varchar (100) = '2019-03-28 21:02:04' izberite pretvori (datetime2, @ date_time_value, 126) kot [llll-mm-ddThh: mi: ss.mmm]

Slika 7: Mednarodni standard datuma ISO 8601

Priporočila:

Upam, da bo ta članek pomagal odpraviti zmedo, ki sem jo pogosto videl v skupnosti glede vrednosti datuma / časa. Priporočljivo je, da datumov nikoli ne shranjujte v besedilnem tipu (varchar, char, nvarchar, nchar ali besedilo). Vedno shranite datumsko vrednost v stolpce DATE, DATETIME in po možnosti DATETIME2 (zagotavlja večjo natančnost) in pustite oblikovanje podatkov o datumu na plast uporabniškega vmesnika, namesto da bi ga pridobili iz baze podatkov.

2 minuti branja