sql >> Databáze >  >> RDS >> Sqlserver

PARSE() vs CAST() vs CONVERT() v SQL Server:Jaký je rozdíl?

Možná jste se setkali s T-SQL PARSE() , CAST() a CONVERT() funkce při práci se serverem SQL a přemýšleli, jaký je rozdíl. Zdá se, že všechny tři funkce dělají totéž, ale jsou mezi nimi jemné rozdíly.

V tomto článku se snažím nastínit hlavní rozdíly mezi těmito funkcemi.

Porovnání

Zde je tabulka, která nastiňuje hlavní rozdíly mezi CONVERT() , CAST() a PARSE() funkce na serveru SQL:

CONVERT() CAST() PARSE()
Oficiální definice Převede výraz jednoho datového typu na jiný. Převede výraz jednoho datového typu na jiný. Vrátí výsledek výrazu přeložený na požadovaný datový typ na serveru SQL.
Přijatá hodnota Jakýkoli platný výraz. Jakýkoli platný výraz. Řetězec.
Vrácená hodnota 2. argument, přeložený na požadovaný datový typ, jak je uveden v 1. argumentu. 1. argument, přeložený na požadovaný datový typ, jak je poskytován 2. argumentem. 1. argument, přeložený na požadovaný datový typ, jak je poskytován 2. argumentem.
Podporované konverze Mezi libovolnými dvěma datovými typy. Mezi libovolnými dvěma datovými typy. Pouze od řetězce po typ data/času a čísel.
Přijímá styl Argument? Ano. Ne. Ne.
Přijímá kulturu Argument? Ne. Ne. Ano.
Vyžaduje rozhraní .NET Framework? Ne. Ne. Ano.

Některé další body kromě výše uvedené tabulky:

  • Dokumentace společnosti Microsoft uvádí, že PARSE() nebude vzdálená (protože závisí na přítomnosti CLR). Vzdálená komunikace funkce, která vyžaduje CLR, by způsobila chybu na vzdáleném serveru.
  • Existují některé hodnoty, které PARSE() dokáže řešit ale CAST() a CONVERT() nelze (například řetězce používající určité formáty data).
  • CAST() je součástí standardu ANSI SQL-92.
  • Někteří tvrdí, že CAST() má lepší výkon než ostatní dva.
  • Při analýze hodnot řetězce dochází k určité režii výkonu. Proto PARSE() obvykle poběží pomaleji než ostatní dva.

Níže jsou uvedeny příklady situací, kdy by každá funkce byla nejvhodnější.

Kdy použít CAST()

Dobrým argumentem by mohlo být použití CAST() pro jakýkoli scénář, který není uveden níže. Jak již bylo zmíněno, CAST() je součástí standardu ANSI SQL od SQL-92, takže by měl být lépe přenosný mezi různými DBMS (pokud je to požadavek).

Někteří také tvrdí, že CAST() má lepší výkon než ostatní dvě (zde je zajímavý článek, který porovnává výkon všech tří funkcí).

Existují však také platné důvody, proč byste mohli preferovat (nebo potřebovat) použití CONVERT() přes CAST() .

Kdy použít CONVERT()

CONVERT() funkce se může hodit, když potřebujete použít style argument k určení, jak má být datum formátováno při převodu mezi datem a řetězcem. Zde je několik příkladů:

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';

Výsledek:

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

To lze provést pouze pomocí CONVERT() protože:

  • CAST() nepodporuje style argument; a
  • PARSE() nepřevádí z data/času na hodnotu řetězce (také nepodporuje style argument)

Kdy použít PARSE()

Navzdory různým nevýhodám této funkce (výkon, závislost na .NET, omezené převody datových typů) má také některé výhody a existují scénáře, kdy by mohla být vaší jedinou volbou. Například při zadávání data, které obsahuje název dne v týdnu, například Pátek, 20. července 2018 .

Když ostatní vrátí chybu

Zde jsou příklady, kde PARSE() je jedinou funkcí ze tří, která dokáže úspěšně převést hodnotu bez vyvolání chyby.

V těchto příkladech se pokoušíme převést různé hodnoty řetězce na datum datový typ. Hodnoty řetězce, které poskytujeme, však zahrnují název dne v týdnu. To způsobuje problémy s CAST() a CONVERT() , ale PARSE() nemá problém.

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';

Výsledek:

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

Takže PARSE() nemá problém s formátem data, který poskytujeme.

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';

Výsledek:

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

Takže CONVERT() není schopen převést řetězec, když je v takovém formátu.

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';

Výsledek:

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

A CAST() vrací stejnou chybu.

Pokud tedy zjistíte, že se u ostatních dvou funkcí objevují chyby, zkuste PARSE() místo toho.

Určení kultury

Další scénář, kdy byste mohli raději použít PARSE() funkce je při specifikování kultury/jazyka, ve kterém je řetězec poskytován. PARSE() má volitelný argument, který vám umožňuje určit, která kultura se má použít. Pokud je vynechán, použije se jazyk aktuální relace.

Příklad zahrnutí culture argument:

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';

Výsledek:

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

Alternativa kultury

Navzdory výhodě možnosti specifikovat kulturu pomocí PARSE() , máte možnost změnit nastavení jazyka, což znamená, že stejného efektu můžete dosáhnout při použití CAST() nebo CONVERT() .

Například pomocí SET LANGUAGE us_english před dotazem změní aktuální nastavení jazyka na us_english . I když vám to neumožňuje určit různé kultury v rámci dotazu (jako ve výše uvedeném příkladu), ovlivní to celý dotaz (a jakékoli následné dotazy).

Stejným způsobem můžete také změnit nastavení formátu data. Například SET DATEFORMAT mdy .

Zde je příklad změny nastavení jazyka před spuštěním dotazu pomocí CAST() a CONVERT() :

Němčina:

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

Výsledek:

+------------+
| 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';

Výsledek:

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

Pamatujte, že když to uděláte, změníte prostředí jazyka/formátu data pro relaci. Nezapomeňte jej změnit zpět!


  1. Jak opravit „MySQL ERROR 1819 (HY000):“ v Linuxu

  2. Co je nového v MariaDB 10.4

  3. Plné připojení k SQL

  4. Dosáhněte hierarchie, vztahu rodič/dítě efektivním a snadným způsobem