Kuinka korjata muunnos epäonnistui, kun muunnetaan päivämäärä ja / tai aika merkkijonosta? -Virhe?



Kokeile Instrumenttia Ongelmien Poistamiseksi

On monia tapauksia, joissa päivämäärät ja kellonajat eivät näy haluamassasi muodossa, eivätkä kyselylähdöt sovi katsojien tarpeisiin. On olemassa useita SQL Serverin sisäänrakennettuja ominaisuuksia, jotka muotoilevat päivämäärämerkkijonon tarpeidesi mukaan, mutta jotta SQL Server tulkitsisi merkkijonon ja muuntovirheiden välttämiseksi, sen tulisi olla oikeassa muodossa. Kun yritämme muuntaa päivämäärän tai kellonajan merkkijonosta, ilmenee joskus virhe. 'Muunnos epäonnistui, kun päivämäärä ja / tai aika muunnettiin merkkijonosta.'



päivämäärän ja ajan muuntovirhe

Kuva 1: Päivämäärän ja / tai ajan muuntovirhe merkkijonosta



Edellä mainittu virhe ilmenee normaalisti, kun päivämääräliteraali ei ole oikea eikä sitä voi muuntaa merkkijonosta DateTime- tai date-päivämääräksi. Tämä virhe johtuu useista syistä, joista keskustelemme yksityiskohtaisesti yhdessä ratkaisusarjan kanssa.



Esimerkki 1:

Yhdistynyt kuningaskunta Päivämäärä- ja aikamerkinnät näyttävät päivämäärän päivä-kuukausi-vuoden muodossa (10. tammikuuta 2015 tai 10.1.2015), jonka voimme saavuttaa käyttämällä SQL Server built_in -ominaisuuden 'muuntaa' -toimintoa muotoilutyylillä 103.

Tässä alla olevassa esimerkissä voimme nähdä, että annettu päivämäärämerkkijono on väärässä muodossa. Ensinnäkin se antaa kuukauden, sitten päivät ja viimeisen vuoden, mikä on väärin ja jota SQL Server ei voi tulkita, mikä johtaa virheeseen. Iso-Britannian tyylin päivämäärän muuntamisen oikea muoto käyttäen 103-päivämäärätyyliä on 'pp / kk / vvvv'.

Väärä formaatti:

Ilmoita @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'valitse CONVERT (päivämäärä2, @date_time_value, 103) arvoksi UK_Date_Time_Style

Kuva 2: Väärä päivämäärämuoto, joka johtaa virheeseen



Oikea muoto:

Ison-Britannian ja Ranskan päivämäärämuoto on 103 = 'pp / kk / vvvv' tai 3 = 'pp / kk / vv'. Tässä 103 ja 3 ovat päivämäärätyylejä.

Ilmoita varchar @date_time_value (100) = '10 / 1/15 21:02:04 'valitsemalla CONVERT (päivämäärä2, @date_time_value, 103) Date_Time_Style

Kuva 3: Oikea päivämäärämuoto muodossa 'pp / kk / vvvv' brittiläinen / ranskalainen päivämäärätyyli

Ilmoita @date_time_value varchar (100) = '10 / 1/15 21:02:04 'valitse CONVERT (päivämäärä2, @date_time_value, 3) arvoksi UK_Date_Time_Style

Kuva 4: Oikea päivämäärämuoto muodossa 'pp / kk / vv' brittiläinen / ranskalainen päiväystyyli

Esimerkki 2:

Joskus SQL-palvelimen merkkijonon päivämäärän muuntaminen johtaa virheeseen, ei käytettyjen päivämäärä- tai aikamuotojen takia, vaan siksi, että yrität tallentaa virheellisiä tietoja, joita järjestelmä ei hyväksy.

Väärä päivämäärä:

Seuraavan virheen syy on pelkästään se, että vuonna 2019 ei ole päivämäärää ”29. helmikuuta”, koska se ei ole karkausvuosi.

Ilmoita @date_time_value varchar (100) = '2019-02-29 21:02:04' valitse cast (@date_time_value päivämäärä2) date_time_value

Kuva 5: Vuonna 2019 nostettu virhe ei ole karkausvuosi, joten sillä ei ole päivämäärää 29. helmikuuta

Oikea:

Ilmoita @date_time_value varchar (100) = '2019-02-28 21:02:04' valitse cast (@date_time_value päivämäärä2) date_time_value

Kuva 6: Oikea päivämäärä

ISO 8601 päivämäärämuoto:

Vaikka päivämääräarvojen manipuloimiseksi on saatavana lukuisia muotoja, maailmanlaajuisen / kansainvälisen massan parissa työskenteleminen voi olla käytettävyysongelma valita päivämääräajan esitys. Joten kulttuurikohtaisia ​​päivämäärä / aika-kirjaimia tulisi välttää. Jos pidämme tätä päivämäärää '03/08/2018', sitä tulkitaan eri tavoin eri puolilla maailmaa.

  • Ison-Britannian tyylillä sitä tulkitaan '8. maaliskuuta 2018'
  • Eurooppalaiseen tyyliin sitä tulkitaan '3. elokuuta 2018'

Onneksi ISO: n kehittämässä kansainvälisessä päivämäärämuodossa on yksi vaihtoehto. Maailmanlaajuinen ISO 8601 -muoto 'VVVV-KK-PPNTh: mm: ss' on kielikohtaisempi vaihtoehto merkkijono-literaaleille ja se käsittelee kaikkia näitä kysymyksiä. Kun taas 'yyyy' on vuosi, 'mm' on kuukausi ja 'dd' on päivä. Joten päivämäärä '8. maaliskuuta 2018' kansainvälisessä ISO-muodossa on kirjoitettu '2018-03-08'. ISO-muoto on siis paras valinta päivämäärän esittämiseen.

Ilmoita @date_time_value varchar (100) = '2019-03-28 21:02:04' valitse muunna (päivämäärä2, @ date_time_value, 126) muodossa [vvvv-kk-ppThh: mi: ss.mmm]

Kuva 7: Kansainvälisen standardin ISO 8601 päivämäärämuoto

Suositukset:

Toivottavasti tämä artikkeli auttaa lievittämään sekaannusta, jonka olen usein nähnyt yhteisössä päivämäärä / aika-arvoista. On kuitenkin suositeltavaa, ettet koskaan tallenna päivämääriä tekstityyppiin (varchar, char, nvarchar, nchar tai teksti). Päivämäärän arvo tallennetaan aina DATE, DATETIME ja mieluiten DATETIME2 (tarjoaa tarkkuutta) -tyyppisiin sarakkeisiin ja jätä päivämäärätietojen muotoilu käyttöliittymäkerrokseen sen sijaan, että se noudetaan tietokannasta.

2 minuuttia luettu