共用方式為


FORMAT (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

傳回以指定格式與選擇性文化特性所格式化的值。 使用函 FORMAT 式將日期/時間和數位值的地區設定感知格式設定為字串。 針對一般資料類型轉換,請使用 CASTCONVERT

Transact-SQL 語法慣例

語法

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

備註

FORMATNULL回無效之文化特性以外的錯誤。 例如,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.CurrencyRateAdventureWorks2022數據表傳回五個數據列。 數據行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