FORMAT (Transact-SQL)
適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲
傳回以指定格式與選擇性文化特性所格式化的值。 使用函 FORMAT
式將日期/時間和數位值的地區設定感知格式設定為字串。 針對一般資料類型轉換,請使用 CAST
或 CONVERT
。
語法
FORMAT( value , format [ , culture ] )
引數
value
要格式化之受支援資料類型的運算式。 如需有效類型的清單,請參閱一節中的表格。
format
nvarchar 格式模式。
format 自變數必須包含有效的 .NET Framework 格式字串,可以是標準格式字串(例如 "C"
或 "D"
),或是日期和數值的自定義字元模式(例如 , "MMMM DD, yyyy (dddd)"
。 不支援複合格式設定。
如需這些格式模式的完整說明,請參閱 .NET Framework 文件中有關一般字串格式、自訂日期與時間格式,以及自訂數字格式的資訊。 如需詳細資訊,請參閱格式類型。
culture
指定文化特性的選用 nvarchar 引數。
如果未提供文化特性自變數,則會使用目前會話的語言。 此語言會隱含設定,或使用語句明確 SET LANGUAGE
設定。
culture 接受 .NET Framework 支援的任何文化特性做為自變數;不限於 SQL Server 明確支持的語言。 如果文化特性自變數無效,FORMAT
則會引發錯誤。
傳回類型
nvarchar 或 null
傳回值的長度取決於 format。
備註
FORMAT
傳NULL
回無效之文化特性以外的錯誤。 例如,NULL
如果格式中指定的值無效,則會傳回 。
函 FORMAT
式不具決定性。
FORMAT
依賴 .NET Framework Common Language Runtime (CLR) 的存在。
此函式無法遠端,因為它取決於CLR的存在。 從遠端處理需要 CLR 的函數可能會導致遠端伺服器發生錯誤。
FORMAT
依賴 CLR 格式規則,該規則會指出必須逸出冒號和句點。 因此,當格式字串 (second parameter) 包含冒號或句點時,當輸入值 (first parameter) 是 time 數據類型時,必須使用反斜杠逸出冒號或句號。 請參閱 D. 具有 time 資料類型的 FORMAT。
下表列出 value 引數可接受的資料類型,以及其 .NET Framework 對應的對等類型。
類別 | 類型 | .NET 類型 |
---|---|---|
數值 | bigint | Int64 |
數值 | int | Int32 |
數值 | smallint | Int16 |
數值 | tinyint | Byte |
數值 | decimal | SqlDecimal |
數值 | numeric | SqlDecimal |
數值 | float | Double |
數值 | real | Single |
數值 | smallmoney | Decimal |
數值 | money | Decimal |
日期及時間 | date | DateTime |
日期及時間 | time | TimeSpan |
日期及時間 | datetime | DateTime |
日期及時間 | smalldatetime | DateTime |
日期及時間 | datetime2 | DateTime |
日期及時間 | datetimeoffset | DateTimeOffset |
範例
A. 簡單的 FORMAT 範例
下列範例會傳回針對不同文化特性格式化的簡單日期。
DECLARE @d AS DATE = '08/09/2024';
SELECT FORMAT(@d, 'd', 'en-US') AS 'US English',
FORMAT(@d, 'd', 'en-gb') AS 'British English',
FORMAT(@d, 'd', 'de-de') AS 'German',
FORMAT(@d, 'd', 'zh-cn') AS 'Chinese Simplified (PRC)';
SELECT FORMAT(@d, 'D', 'en-US') AS 'US English',
FORMAT(@d, 'D', 'en-gb') AS 'British English',
FORMAT(@d, 'D', 'de-de') AS 'German',
FORMAT(@d, 'D', 'zh-cn') AS 'Chinese Simplified (PRC)';
結果集如下所示。
US English British English German Simplified Chinese (PRC)
----------- ---------------- ----------- -------------------------
8/9/2024 09/08/2024 09.08.2024 2024/8/9
US English British English German Chinese (Simplified PRC)
----------------------- ---------------- ------------------------ -------------------------
Friday, August 9, 2024 09 August 2024 Freitag, 9. August 2024 2024年8月9日
B. 包含自訂格式字串的 FORMAT
下列範例會藉由指定自訂格式顯示格式數值。 此範例假設目前的日期為 2024 年 8 月 9 日。 如需有關這些自訂格式和其他自訂格式的詳細資訊,請參閱自訂數值格式字串。
DECLARE @d AS DATE = GETDATE();
SELECT FORMAT(@d, 'dd/MM/yyyy', 'en-US') AS 'Date',
FORMAT(123456789, '###-##-####') AS 'Custom Number';
結果集如下所示。
Date Custom Number
----------- --------------
09/08/2024 123-45-6789
C. 數值類型的 FORMAT
下列範例會從資料庫中的Sales.CurrencyRate
AdventureWorks2022
數據表傳回五個數據列。 數據行EndOfDateRate
會儲存為數據表中的 money 類型。 在此範例中,資料行會以未格式化的狀態傳回,然後藉由指定 .NET Number 格式、General 格式和 Currency 格式類型進行格式化。 如需有關這些數值格式和其他數值格式的詳細資訊,請參閱標準數值格式字串。
SELECT TOP (5) CurrencyRateID,
EndOfDayRate,
FORMAT(EndOfDayRate, 'N', 'en-us') AS 'Numeric Format',
FORMAT(EndOfDayRate, 'G', 'en-us') AS 'General Format',
FORMAT(EndOfDayRate, 'C', 'en-us') AS 'Currency Format'
FROM Sales.CurrencyRate
ORDER BY CurrencyRateID;
結果集如下所示。
CurrencyRateID EndOfDayRate Numeric Format General Format Currency Format
-------------- ------------ -------------- -------------- ---------------
1 1.0002 1.00 1.0002 $1.00
2 1.55 1.55 1.5500 $1.55
3 1.9419 1.94 1.9419 $1.94
4 1.4683 1.47 1.4683 $1.47
5 8.2784 8.28 8.2784 $8.28
此範例會指定德文文化 (de-de
)。
SELECT TOP (5) CurrencyRateID,
EndOfDayRate,
FORMAT(EndOfDayRate, 'N', 'de-de') AS 'Numeric Format',
FORMAT(EndOfDayRate, 'G', 'de-de') AS 'General Format',
FORMAT(EndOfDayRate, 'C', 'de-de') AS 'Currency Format'
FROM Sales.CurrencyRate
ORDER BY CurrencyRateID;
CurrencyRateID EndOfDayRate Numeric Format General Format Currency Format
-------------- ------------ -------------- -------------- ---------------
1 1.0002 1,00 1,0002 1,00 €
2 1.55 1,55 1,5500 1,55 €
3 1.9419 1,94 1,9419 1,94 €
4 1.4683 1,47 1,4683 1,47 €
5 8.2784 8,28 8,2784 8,28 €
D. 具有 time 資料類型的 FORMAT
FORMAT
在這些情況下會傳 NULL
回 ,因為 .
和 :
不會逸出。
SELECT FORMAT(CAST('07:35' AS TIME), N'hh.mm'); --> returns NULL
SELECT FORMAT(CAST('07:35' AS TIME), N'hh:mm'); --> returns NULL
Format 會傳回格式化的字串,因為會逸出 .
和 :
。
SELECT FORMAT(CAST('07:35' AS TIME), N'hh\.mm'); --> returns 07.35
SELECT FORMAT(CAST('07:35' AS TIME), N'hh\:mm'); --> returns 07:35
Format 會傳回指定 AM 或 PM 的格式化目前時間。
SELECT FORMAT(SYSDATETIME(), N'hh:mm tt'); --> returns 03:46 PM
SELECT FORMAT(SYSDATETIME(), N'hh:mm t'); --> returns 03:46 P
Format 會傳回指定的時間,並顯示AM。
SELECT FORMAT(CAST('2018-01-01 01:00' AS DATETIME2), N'hh:mm tt'); --> returns 01:00 AM
SELECT FORMAT(CAST('2018-01-01 01:00' AS DATETIME2), N'hh:mm t'); --> returns 01:00 A
Format 會傳回指定的時間,並顯示 PM。
SELECT FORMAT(CAST('2018-01-01 14:00' AS DATETIME2), N'hh:mm tt'); --> returns 02:00 PM
SELECT FORMAT(CAST('2018-01-01 14:00' AS DATETIME2), N'hh:mm t'); --> returns 02:00 P
Format 會以 24 小時格式傳回指定的時間。
SELECT FORMAT(CAST('2018-01-01 14:00' AS DATETIME2), N'HH:mm'); --> returns 14:00
E. 使用大數位的逗號分隔符格式化
下列範例示範如何使用逗號分隔符來格式化大型數位。
SELECT FORMAT(1234567.89, 'N0') AS FormattedNumber;
結果集如下所示。
1,234,568
這個範例使用 N
格式規範。
N
規範用於數值,而且可以藉由變更格式字串來調整小數位數(例如,N2
兩個小數字數)。
FORMAT ( value, format_string [, culture ] )
參數
-
value
:要格式化的值。 -
format_string
:指定要套用格式的字串。 -
culture
:( 選擇性) 字串,指定要用於格式化的文化特性。
SELECT FORMAT(1234567.89, 'N0') AS FormattedNumber;
1,234,568