Database.Guide

Olet ehkä törmännyt T-SQL PARSE()-, CAST()– ja CONVERT()-funktioihin työskennellessäsi SQL Serverin kanssa ja miettinyt, mikä on niiden ero. Kaikki kolme funktiota näyttävät tekevän saman asian, mutta niiden välillä on hienoisia eroja.

Tässä artikkelissa pyrin hahmottelemaan näiden funktioiden tärkeimmät erot.

Vertailu

Tässä on taulukko, jossa esitetään SQL Serverin CONVERT()-, CAST()– ja PARSE()-funktioiden tärkeimmät erot:

CONVERT() CAST() PARSE()
Virallinen määritelmä Muunntaa yhden tietotyypin lausekkeen toiseen. Muunntaa yhden tietotyypin lausekkeen toiseksi. Palauttaa lausekkeen tuloksen, joka on käännetty SQL Serverissä pyydettyyn tietotyyppiin.
Hyväksytty arvo Mikä tahansa pätevä lauseke. Mikä tahansa kelvollinen lauseke. String.
Return Value 2. argumentti, joka on käännetty pyydettyyn tietotyyppiin 1. argumentin mukaisesti. 1. argumentti, käännetään pyydettyyn tietotyyppiin 2. argumentin antaman mukaisesti. 1. argumentti, käännetään pyydettyyn tietotyyppiin 2. argumentin antaman mukaisesti.
Tuetut muunnokset Minkä tahansa kahden tietotyypin välillä. Minkä tahansa kahden tietotyypin välillä. Ainoastaan merkkijonosta päivämäärään/aikaan ja numerotyyppeihin.
Hyväksyy tyylilaji-argumentin? Kyllä. Ei. Ei.
Accepts the culture Argument? Ei. Ei. Kyllä.
Tarvitsee .NET Frameworkin? Ei. Ei. Kyllä.

Joitakin muita seikkoja edellä olevan taulukon lisäksi:

  • Microsoftin dokumentaatio huomauttaa, että PARSE() ei siirry etäkäynnistettäväksi (koska se riippuu CLR:n läsnäolosta). CLR:ää vaativan toiminnon uudelleenlähetys aiheuttaisi virheen etäpalvelimella.
  • On joitakin arvoja, joita PARSE() voi käsitellä, mutta CAST() ja CONVERT() eivät (esimerkiksi merkkijonot, jotka käyttävät tiettyjä päivämääräformaatteja).
  • CAST() sisältyy ANSI SQL-92 -standardiin.
  • Jotkut väittävät, että CAST() on suorituskyvyltään parempi kuin kaksi muuta.
  • Seurausmerkkiarvojen jäsennyksessä on jonkin verran suorituskyvyn yleiskustannuksia. Siksi PARSE() toimii tyypillisesti hitaammin kuin kaksi muuta.

Alhaalla on esimerkkejä tilanteista, joissa kukin funktio olisi sopivin.

Kuinka käyttää CAST()

Hyvin voidaan perustella CAST():n käyttämistä missä tahansa skenaariossa, jota ei ole lueteltu alla. Kuten mainittiin, CAST() on ollut osa ANSI SQL-standardia SQL-92:sta lähtien, joten sen pitäisi olla paremmin siirrettävissä eri DBMS-järjestelmien välillä (jos se on vaatimuksena).

Jotkut väittävät myös, että CAST():lla on parempi suorituskyky kuin kahdella muulla (tässä on mielenkiintoinen artikkeli, jossa verrataan kaikkien kolmen funktion suorituskykyä).

On kuitenkin myös perusteltuja syitä, joiden vuoksi saatat haluta (tai tarvita) käyttää mieluummin CONVERT():aa kuin CAST():aa.

Milloin käyttää CONVERT()

Funktio CONVERT() voi olla kätevä silloin, kun sinun on määritettävä style-argumentin avulla, miten päiväys on muotoiltava, kun muunnat päivämäärän ja merkkijonon välillä. Tässä muutamia esimerkkejä:

DECLARE @date datetime2 = '2018-06-07 02:35:52.8537677';SELECT CONVERT(nvarchar(30), @date, 100) AS '100', CONVERT(nvarchar(30), @date, 101) AS '101', CONVERT(nvarchar(30), @date, 102) AS '102', CONVERT(nvarchar(30), @date, 103) AS '103';

Tulos:

+---------------------+------------+------------+------------+| 100 | 101 | 102 | 103 ||---------------------+------------+------------+------------|| Jun 7 2018 2:35AM | 06/07/2018 | 2018.06.07 | 07/06/2018 |+---------------------+------------+------------+------------+

Voit tehdä tämän vain CONVERT():n avulla, koska:

  • CAST() ei tue style-argumenttia; ja
  • PARSE() ei muunna päivämäärää/aikaa merkkijonoarvoksi (sekään ei tue style-argumenttia)

Milloin PARSE()

Kuinka käyttää PARSE()

Tämän funktion monista haitoista huolimatta (suorituskyky, riippuvuus .NET, rajoitetut tietotyyppimuunnokset), sillä on myös joitakin etuja, ja joissakin skenaarioissa se voi olla ainoa vaihtoehto. Esimerkiksi silloin, kun annat päivämäärän, joka sisältää viikonpäivän nimen, kuten perjantai 20. heinäkuuta 2018.

Kun muut palauttavat virheen

Tässä on esimerkkejä, joissa PARSE() on kolmesta funktiosta ainoa, joka pystyy onnistuneesti muuntamaan arvon heittämättä virhettä.

Näissä esimerkeissä yritämme muuntaa erilaisia merkkijonoarvoja päivämäärän tietotyypiksi. Antamamme merkkijonoarvot sisältävät kuitenkin viikonpäivän nimen. Tämä aiheuttaa ongelmia CAST():lle ja CONVERT():lle, mutta PARSE():lla ei ole ongelmia.

PARSE()

SELECT PARSE('Friday, 20 July 2018' AS date) AS 'Result 1', PARSE('Fri, 20 July 2018' AS date) AS 'Result 2', PARSE('Friday 20 July 2018' AS date) AS 'Result 3';

Tulos:

+------------+------------+------------+| Result 1 | Result 2 | Result 3 ||------------+------------+------------|| 2018-07-20 | 2018-07-20 | 2018-07-20 |+------------+------------+------------+

Siten PARSE():lla ei ole ongelmia antamamme päivämäärän muodon kanssa.

CONVERT()

SELECT CONVERT(date, 'Friday, 20 July 2018') AS 'Result 1', CONVERT(date, 'Fri, 20 July 2018') AS 'Result 2', CONVERT(date, 'Friday 20 July 2018') AS 'Result 3';

Tulos:

Conversion failed when converting date and/or time from character string.

Siten CONVERT() ei pysty muuntamaan merkkijonoa, kun se on tällaisessa muodossa.

CAST()

SELECT CAST('Friday, 20 July 2018' AS date) AS 'Result 1', CAST('Fri, 20 July 2018' AS date)AS 'Result 2', CAST('Friday 20 July 2018' AS date) AS 'Result 3';

Tulos:

Conversion failed when converting date and/or time from character string.

Ja CAST() palauttaa saman virheen.

Jos siis huomaat saavasi virheitä kahdella muulla funktiolla, kokeile sen sijaan PARSE().

Kulttuurin määrittäminen

Toinen skenaario, jossa saatat käyttää mieluummin PARSE()-funktiota, on silloin, kun määrität kulttuurin/kielen, jolla merkkijono annetaan. PARSE()-funktiossa on valinnainen argumentti, jonka avulla voit määrittää käytettävän kulttuurin. Jos se jätetään pois, käytetään nykyisen istunnon kieltä.

Esimerkki culture-argumentin sisällyttämisestä:

SELECT PARSE('07/01/2018' AS date USING 'en-US') AS 'Result 1', PARSE('07/01/2018' AS date USING 'de-DE') AS 'Result 2';

Tulos:

+------------+------------+| Result 1 | Result 2 ||------------+------------|| 2018-07-01 | 2018-01-07 |+------------+------------+

Kulttuurivaihtoehto

Vaikka etuna on, että kulttuurin voi määritellä PARSE():n avulla, kieliasetuksia voi vaihtaa, joten saman vaikutuksen voi saada aikaan myös CAST():aa tai CONVERT():aa käyttämällä.

Käyttämällä esimerkiksi SET LANGUAGE us_english ennen kyselyä voit muuttaa nykyiset kieliasetukset muotoon us_english. Vaikka tämä ei mahdollista eri kulttuurien määrittämistä kyselyn sisällä (kuten yllä olevassa esimerkissä), se vaikuttaa koko kyselyyn (ja kaikkiin myöhempiin kyselyihin).

Voit myös muuttaa päivämäärämuotoasetuksia samalla tavalla. Esimerkiksi SET DATEFORMAT mdy.

Tässä esimerkki kieliasetuksen muuttamisesta ennen kyselyn suorittamista CAST() ja CONVERT():

Saksa:

SET LANGUAGE German;SELECT CONVERT(date, '07/01/2018') AS 'Convert';SELECT CAST('07/01/2018' AS date) AS 'Cast';

Tulos:

+------------+| Convert ||------------|| 2018-01-07 |+------------+Die Spracheneinstellung wurde in Deutsch geändert.+------------+| Cast ||------------|| 2018-01-07 |+------------+

us_english:

SET LANGUAGE us_english;SELECT CONVERT(date, '07/01/2018') AS 'Convert';SELECT CAST('07/01/2018' AS date) AS 'Cast';

Tulos:

+------------+| Convert ||------------|| 2018-07-01 |+------------+Changed language setting to us_english.+------------+| Cast ||------------|| 2018-07-01 |+------------+

Muista, että kun teet tämän, vaihdat istunnon kieli-/päivämäärämuotoympäristöä. Älä unohda muuttaa sitä takaisin!

Vastaa

Sähköpostiosoitettasi ei julkaista.