格式 (Transact-SQL)

适用于:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 中的SQL分析端点Microsoft Fabric中的仓库Microsoft Fabric中的SQL数据库

返回以指定的格式和可选的区域性格式化的值。 将 FORMAT 函数用于日期/时间和数字值的区域设置感知格式,并将数字值用作字符串。 对于常规数据类型转换,请使用 CAST 或 CONVERT。

Transact-SQL 语法约定

语法

FORMAT( value , format [ , culture ] )

参数

价值

支持格式化的数据类型的表达式。 有关有效类型的列表,请参阅“ 备注 ”部分中的表。

format

nvarchar 格式模式 。

格式参数必须包含有效的 .NET Framework 格式字符串,可以是标准格式字符串(例如,"C"或"D"),或者是日期和数值的自定义字符模式(例如,"MMMM dd, yyyy (dddd)")。 不支持复合格式。

有关这些格式模式的完整解释,请查阅有关常规字符串格式、自定义日期和时间格式以及自定义数字格式的 .NET Framework 文档。 有关详细信息,请参阅类型格式设置。

区域性

指定区域性的可选 nvarchar 参数 。

如果未提供区域性参数,则使用当前会话的语言。 此语言是隐式设置的,也可以使用该语句显式 SET LANGUAGE 设置。 区域性 接受 .NET Framework 支持的任何区域性作为参数;它不限于 SQL Server 显式支持的语言。 如果区域性参数无效,FORMAT则引发错误。

返回类型

nvarchar 或 Null

返回值的长度由 format 确定 。

注解

FORMAT NULL返回非区域性无效的错误。 例如,如果以NULL指定的值无效,则返回该值。

该 FORMAT 函数是不确定的。

FORMAT 依赖于 .NET Framework 公共语言运行时(CLR)的存在。

此函数无法进行远程控制,因为它取决于 CLR 的存在。 远程处理需要 CLR 的函数可能导致在远程服务器上出现错误。

FORMAT 依赖于 CLR 格式规则,该规则指示必须转义冒号和句点。 因此,当格式字符串(第二个参数)包含冒号或句点时,当输入值(第一个参数)属于 时间 数据类型时,必须使用反斜杠转义冒号或句点。 请参阅时间数据类型的 D. FORMAT。

下表列出了 value 参数可接受的数据类型,其中还有相关的 .NET Framework 映射等效类型 。

类别 类型 .NET 类型
数值 bigint Int64
数值 int Int32
数值 smallint Int16
数值 tinyint Byte
数值 十进制 SqlDecimal
数值 数值的 SqlDecimal
数值 漂浮 Double
数值 真实 Single
数值 smallmoney Decimal
数值 钱 Decimal
日期和时间 日期 DateTime
日期和时间 时间 TimeSpan
日期和时间 日期/时间 DateTime
日期和时间 smalldatetime DateTime
日期和时间 datetime2 DateTime
日期和时间 datetimeoffset DateTimeOffset

示例

答: 简单 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(987654320, '###-##-####') AS 'Custom Number';

结果集如下。

Date         Custom Number
-----------  --------------
09/08/2024   987-65-4320

°C 用于数值类型的 FORMAT

以下示例从数据库中的 Sales.CurrencyRate 表中 AdventureWorks2025 返回五行。 列 EndOfDateRate 作为类型 货币 存储在表中。 在本示例中,该列以非格式化形式返回,然后通过指定 .NET 数字格式、常规格式和货币格式类型进行格式化。 有关这些格式和其他数字格式的详细信息,请参阅标准数字格式字符串。

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. 时间数据类型的 D. 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

格式返回带格式的当前时间,并指定 AM 或 PM。

SELECT FORMAT(SYSDATETIME(), N'hh:mm tt'); --> returns 03:46 PM
SELECT FORMAT(SYSDATETIME(), N'hh:mm t');  --> returns 03:46 P

格式返回指定的时间,显示 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

格式返回指定的时间,显示 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

格式以 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