I SQL Server kan du använda T-SQL FORMAT()
funktion för att returnera värden som siffror och datum som formaterade strängar.
Du anger värdet som ska formateras och du anger formatet som ska användas. Funktionen accepterar ett valfritt argument som låter dig ange en kultur som ska användas när du formaterar värdet.
Syntax
Syntaxen ser ut så här:
FORMAT ( value, format [, culture ] )
Där value
är värdet du vill ha formaterat och format
är en giltig formatsträng som anger det önskade formatet.
Den valfria culture
argument kan användas för att specificera en kultur. Om det utelämnas används språket för den aktuella sessionen.
FORMAT
funktion är icke-deterministisk.
Exempel 1 – Formatera ett tal
Här är ett exempel på hur du formaterar ett tal:
SELECT FORMAT(1, 'N') AS Result;
Resultat:
+----------+ | Result | |----------| | 1.00 | +----------+
I det här fallet använde jag N
som formatsträng. Detta är en standard numerisk formatspecifikation för att mata ut värdet som ett tal. Denna speciella formatspecifikation resulterar i att utdata formateras med heltals- och decimalsiffror, gruppavgränsare och en decimalavgränsare med valfritt negativt tecken. Denna formatspecifikator är skiftlägesokänslig, så antingen N
eller n
är bra.
Exempel 2 – Formatera till en valuta
Här är ett exempel på hur du formaterar ett tal som en valuta:
SELECT FORMAT(1, 'C') AS Result;
Resultat:
+----------+ | Result | |----------| | $1.00 | +----------+
Fler numeriska format
Det finns många fler formatsträngar som kan användas med FORMAT()
fungera. Det finns till exempel formatsträngar för procentsatser, fixpunkt, exponentiell (vetenskaplig), hexadecimal och mer.
De numeriska formatsträngarna är uppdelade i standard och anpassad.
Följande två artiklar listar alla numeriska formatsträngar, inklusive exempel:
- Stängar i standardnumeriskt format
- Strängar med anpassat numeriskt format
Se även Hur man formaterar tal i SQL Server för fler exempel på formatering av tal.
Exempel 3 – Formatera ett datum
Här är ett exempel på hur du formaterar ett datum:
SELECT GETDATE() AS 'Unformatted Date', FORMAT( GETDATE(), 'D') AS 'Formatted Date';
Resultat:
+-------------------------+------------------------+ | Unformatted Date | Formatted Date | |-------------------------+------------------------| | 2019-05-08 06:16:55.613 | Wednesday, May 8, 2019 | +-------------------------+------------------------+
I det här fallet använde jag D
som anger ett långt datummönster.
Fler datumformat
Det finns många fler formatsträngar som kan användas för att formatera datum. Precis som med de numeriska formatsträngarna är datum- och tidsformatsträngar separerade i standard och anpassade, så att du kan bygga dina egna anpassade format, eller så kan du lita på ett standardformat.
Följande två artiklar listar alla datum- och tidsformatsträngar, inklusive exempel:
- Stängar för standardformat för datum och tid
- Anpassade datum- och tidsformatsträngar
Se även Hur man formaterar datum och tid i SQL Server för fler exempel.
Exempel 4 – Den valfria culture
Argument
Här är ett exempel på hur du använder culture
argument för att returnera ett värde i olika valutor:
SELECT FORMAT(1, 'C', 'fr-FR') AS 'France', FORMAT(1, 'C', 'th-TH') AS 'Thailand', FORMAT(1, 'C', 'ja-JP') AS 'Japan';
Resultat:
+----------+------------+---------+ | France | Thailand | Japan | |----------+------------+---------| | 1,00 € | ฿1.00 | ¥1 | +----------+------------+---------+
FORMAT()
funktion accepterar alla kulturer som stöds av .NET Framework som argument; det är inte begränsat till de språk som uttryckligen stöds av SQL Server.
Om du inte anger detta argument används språket för den aktuella sessionen.
För fler exempel, se Hur språkinställningar kan påverka din FORMAT()
Resultat.
Exempel 5 – Ogiltig culture
Argument
Om du anger en ogiltig kultur får du ett felmeddelande:
SELECT FORMAT(1, 'C', 'oop-SS!') AS 'Oops!';
Resultat:
The culture parameter 'oop-SS!' provided in the function call is not supported.
Exempel 6 – Ogiltigt formatvärde
Men för andra fel returnerar funktionen NULL
. Här är till exempel vad som händer om jag anger ett ogiltigt värde som ska formateras:
SELECT FORMAT(GETDATE(), 'C') AS 'Result';
Resultat:
+----------+ | Result | |----------| | NULL | +----------+
I det här fallet försökte jag formatera ett datum till en valuta, och därför blev resultatet NULL
.
Giltiga datatyper
FORMAT()
förlitar sig på närvaron av .NET Framework Common Language Runtime (CLR) och använder CLR-formateringsreglerna.
Följande datatyper kan formateras med FORMAT()
fungera. Den här listan innehåller de acceptabla datatyperna för indatasträngen tillsammans med deras .NET Framework-mappningstyper.
Kategori | Typ | .NET-typ |
---|---|---|
Numerisk | stor | Int64 |
Numerisk | int | Int32 |
Numerisk | smallint | Int16 |
Numerisk | tinyint | Byte |
Numerisk | decimal | SqlDecimal |
Numerisk | numerisk | SqlDecimal |
Numerisk | flyta | Dubbel |
Numerisk | riktigt | Singel |
Numerisk | småpengar | Decimal |
Numerisk | pengar | Decimal |
Datum och tid | datum | DatumTid |
Datum och tid | tid | Tidsspann |
Datum och tid | datumtid | DatumTid |
Datum och tid | smalldatetime | DatumTid |
Datum och tid | datetime2 | DatumTid |
Datum och tid | datetimeoffset | DateTimeOffset |
Escaping kolon och perioder för datatypen 'tid'
När du använder FORMAT
, kolon och punkter måste escapes (detta följer CLR-formateringsreglerna). Därför, när formatsträngen (andra parametern) innehåller ett kolon eller punkt, måste kolonet eller perioden escapes med ett snedstreck när ett indatavärde (första parametern) är av tiden datatyp.
Exempel:
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';
Resultat:
+--------------------+-------------+-----------+ | Unformatted Data | Unescaped | Escaped | |--------------------+-------------+-----------| | 12:15:00 | NULL | 12.15 | +--------------------+-------------+-----------+
Så som förväntat returnerar den oescapeda strängen NULL
.
Detta gäller som sagt endast tiden data typ. Om vi ändrar inmatningsvärdet till en annan datatyp behöver vi inte undkomma det:
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';
Resultat:
+-------------------------+-------------+-----------+ | Unformatted Data | Unescaped | Escaped | |-------------------------+-------------+-----------| | 1900-01-01 12:15:00.000 | 12.15 | 12.15 | +-------------------------+-------------+-----------+
I det här fallet är inmatningsvärdet datetime , och därför blir resultatet bra utan att undvika det.
Du kan också använda omvänt snedstreck för att undvika alla andra tecken som du vill ha med i resultatsträngen, som annars skulle tolkas som en formatspecifikation. Att föregå ett tecken med ett snedstreck betyder att följande tecken är ett bokstavligt tecken som bör inkluderas i resultatsträngen oförändrad.
I en anpassad datum- och tidsformatsträng, d
, f
, F
, g
, h
, H
, K
, m
, M
, s
, t
, y
, z
, :
, eller /
tecken tolkas som specifikationer för anpassade format snarare än som bokstavliga tecken.
I en sträng med anpassat numeriskt format, #
, 0
, .
, ,
, %
och ‰
symboler tolkas som formatspecifikationer snarare än som bokstavliga tecken. Versaler och gemener E
samt +
och -
symboler kan också tolkas som formatspecifikatorer, beroende på deras placering i formatsträngen.
Om du behöver inkludera ett omvänt snedstreck i resultatsträngen, undvik det med ett nytt snedstreck.
Fjärrkontroll
FORMAT()
Funktionen kan inte fjärrstyras eftersom den beror på närvaron av CLR. Att fjärrstyra en funktion som kräver CLR kan orsaka ett fel på fjärrservern.
När ska FORMAT()
användas Funktion
Microsoft rekommenderar att FORMAT()
funktionen används för språkmedveten formatering av datum/tid och talvärden som strängar, och för allmänna datatypkonverteringar, antingen CAST()
funktionen eller CONVERT()
funktionen ska användas istället.