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

Jak funguje funkce FORMAT() v SQL Server (T-SQL)

V SQL Server můžete použít T-SQL FORMAT() funkce pro vrácení hodnot, jako jsou čísla a data, jako formátované řetězce.

Zadáte hodnotu, která se má formátovat, a určíte formát, který se má použít. Funkce přijímá volitelný argument, který vám umožňuje určit kulturu, která se má použít při formátování hodnoty.

Syntaxe

Syntaxe vypadá takto:

FORMAT ( value, format [, culture ] )

Kde value je hodnota, kterou chcete formátovat, a format je platný formátovací řetězec, který specifikuje požadovaný formát.

Volitelná culture argument lze použít k určení kultury. Pokud je vynechán, použije se jazyk aktuální relace.

FORMAT funkce je nedeterministická.

Příklad 1 – Formátování čísla

Zde je příklad formátování čísla:

SELECT FORMAT(1, 'N') AS Result;

Výsledek:

+----------+
| Result   |
|----------|
| 1.00     |
+----------+

V tomto případě jsem použil N jako formátovací řetězec. Toto je standardní specifikátor číselného formátu pro výstup hodnoty jako čísla. Tento konkrétní specifikátor formátu má za následek, že výstup je formátován pomocí celočíselných a desetinných číslic, oddělovačů skupin a oddělovače desetinných míst s volitelným záporným znaménkem. Tento specifikátor formátu nerozlišuje velká a malá písmena, takže buď N nebo n je v pořádku.

Příklad 2 – Formát na měnu

Zde je příklad formátování čísla jako měny:

SELECT FORMAT(1, 'C') AS Result;

Výsledek:

+----------+
| Result   |
|----------|
| $1.00    |
+----------+

Další číselné formáty

Existuje mnoho dalších formátovacích řetězců, které lze použít s FORMAT() funkce. Existují například formátovací řetězce pro procenta, pevnou řádovou čárku, exponenciální (vědecké), šestnáctkové a další.

Řetězce číselného formátu jsou rozděleny na standardní a vlastní.

Následující dva články obsahují seznam všech řetězců číselného formátu včetně příkladů:

  • Standardní řetězce číselného formátu
  • Řetězce vlastního číselného formátu

Další příklady formátování čísel naleznete také v části Jak formátovat čísla na serveru SQL.

Příklad 3 – Formátování data

Zde je příklad formátování data:

SELECT 
  GETDATE() AS 'Unformatted Date',
  FORMAT( GETDATE(), 'D') AS 'Formatted Date';

Výsledek:

+-------------------------+------------------------+
| Unformatted Date        | Formatted Date         |
|-------------------------+------------------------|
| 2019-05-08 06:16:55.613 | Wednesday, May 8, 2019 |
+-------------------------+------------------------+

V tomto případě jsem použil D který určuje vzor dlouhého data.

Další formáty data

Existuje mnoho dalších formátovacích řetězců, které lze použít pro formátování dat. Stejně jako u řetězců číselného formátu jsou řetězce formátu data a času rozděleny na standardní a vlastní, takže si můžete vytvořit vlastní vlastní formáty, nebo se můžete spolehnout na standardní.

V následujících dvou článcích jsou uvedeny všechny řetězce formátu data a času, včetně příkladů:

  • Standardní řetězce formátu data a času
  • Vlastní řetězce formátu data a času

Další příklady naleznete také v části Jak formátovat datum a čas na serveru SQL.

Příklad 4 – Volitelná culture Argument

Zde je příklad použití culture argument pro vrácení hodnoty v různých měnách:

SELECT 
    FORMAT(1, 'C', 'fr-FR') AS 'France', 
    FORMAT(1, 'C', 'th-TH') AS 'Thailand', 
    FORMAT(1, 'C', 'ja-JP') AS 'Japan';

Výsledek:

+----------+------------+---------+
| France   | Thailand   | Japan   |
|----------+------------+---------|
| 1,00 €   | ฿1.00      | ¥1      |
+----------+------------+---------+

FORMAT() funkce přijímá jakoukoli kulturu podporovanou rozhraním .NET Framework jako argument; není omezena na jazyky výslovně podporované SQL Serverem.

Pokud tento argument neuvedete, použije se jazyk aktuální relace.

Další příklady najdete v tématu Jak může jazyková nastavení ovlivnit váš FORMAT() Výsledky.

Příklad 5 – Neplatná culture Argument

Pokud zadáte neplatnou kulturu, zobrazí se chyba:

SELECT FORMAT(1, 'C', 'oop-SS!') AS 'Oops!';

Výsledek:

The culture parameter 'oop-SS!' provided in the function call is not supported.

Příklad 6 – Neplatná hodnota formátu

U ostatních chyb však funkce vrací NULL . Zde je například uvedeno, co se stane, když zadám neplatnou hodnotu k formátování:

SELECT FORMAT(GETDATE(), 'C') AS 'Result';

Výsledek:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

V tomto případě jsem se snažil formátovat datum do měny, a proto byl výsledek NULL .

Platné datové typy

FORMAT() spoléhá na přítomnost .NET Framework Common Language Runtime (CLR) a používá pravidla formátování CLR.

Následující datové typy lze formátovat pomocí FORMAT() funkce. Tento seznam obsahuje přijatelné datové typy pro vstupní řetězec spolu s jejich ekvivalentními typy mapování .NET Framework.

Kategorie Typ typ .NET
Číselné bigint Int64
Číselné int Int32
Číselné smallint Int16
Číselné tinyint Byte
Číselné desítkové SqlDecimal
Číselné numerické SqlDecimal
Číselné plovoucí Dvojité
Číselné skutečný Svobodný
Číselné malé peníze Desetinné
Číselné peníze Desetinné
Datum a čas datum Datum a čas
Datum a čas čas Časové rozpětí
Datum a čas datetime Datum a čas
Datum a čas smalldatetime Datum a čas
Datum a čas datetime2 Datum a čas
Datum a čas datetimeoffset DateTimeOffset

Escapování dvojteček a teček pro typ dat „čas“

Při použití FORMAT , dvojtečky a tečky musí být escapovány (toto dodržuje pravidla formátování CLR). Pokud tedy formátovací řetězec (druhý parametr) obsahuje dvojtečku nebo tečku, musí být dvojtečka nebo tečka ukončena zpětným lomítkem, pokud je vstupní hodnota (první parametr) čas datový typ.

Příklad:

SELECT 
  CAST('12:15' AS time) AS 'Unformatted Data',
  FORMAT(CAST('12:15' AS time), N'hh.mm') AS 'Unescaped',
  FORMAT(CAST('12:15' AS time), N'hh\.mm') AS 'Escaped';

Výsledek:

+--------------------+-------------+-----------+
| Unformatted Data   | Unescaped   | Escaped   |
|--------------------+-------------+-----------|
| 12:15:00           | NULL        | 12.15     |
+--------------------+-------------+-----------+

Jak se očekávalo, neuvedený řetězec vrátí NULL .

Jak již bylo zmíněno, platí to pouze pro čas datový typ. Pokud změníme vstupní hodnotu na jiný datový typ, nemusíme ji escapovat:

SELECT 
  CAST('12:15' AS datetime) AS 'Unformatted Data',
  FORMAT(CAST('12:15' AS datetime), N'hh.mm') AS 'Unescaped',
  FORMAT(CAST('12:15' AS datetime), N'hh.mm') AS 'Escaped';

Výsledek:

+-------------------------+-------------+-----------+
| Unformatted Data        | Unescaped   | Escaped   |
|-------------------------+-------------+-----------|
| 1900-01-01 12:15:00.000 | 12.15       | 12.15     |
+-------------------------+-------------+-----------+

V tomto případě je vstupní hodnota datetime , a proto je výsledek v pořádku, aniž by z něj uniklo.

Zpětné lomítko můžete také použít k escapování jakéhokoli jiného znaku, který chcete zahrnout do výsledného řetězce, který by byl jinak interpretován jako specifikátor formátu. Pokud znaku předchází zpětné lomítko, znamená to, že následující znak je znakový literál, který by měl být zahrnut do výsledného řetězce beze změny.

Ve vlastním řetězci formátu data a času je d , f , F , g , h , H , K , m , M , s , t , y , z , : , nebo / znaky jsou interpretovány jako vlastní specifikátory formátu spíše než jako doslovné znaky.

V řetězci vlastního číselného formátu # , 0 , . , , , % a symboly jsou interpretovány spíše jako specifikátory formátu než jako doslovné znaky. Velká a malá písmena E stejně jako + a - symboly lze také interpretovat jako specifikátory formátu v závislosti na jejich pozici ve formátovacím řetězci.

Pokud potřebujete do výsledného řetězce zahrnout zpětné lomítko, uzavřete ho jiným zpětným lomítkem.

Vzdálené ovládání

FORMAT() funkci nelze vzdáleně ovládat, protože závisí na přítomnosti CLR. Vzdálená komunikace funkce, která vyžaduje CLR, může způsobit chybu na vzdáleném serveru.

Kdy použít FORMAT() Funkce

Společnost Microsoft doporučuje použít FORMAT() funkce se používá pro formátování hodnot data/času a čísel jako řetězců s ohledem na národní prostředí a pro převod obecných datových typů buď CAST() nebo CONVERT() místo toho by měla být použita funkce.


  1. Jak vložit do stejné tabulky v MySQL?

  2. Získání zvláštní chyby, dotaz SQL Server pomocí klauzule `WITH`

  3. Zjišťování a klasifikace dat SQL

  4. Jak funguje funkce POSITION() v MySQL