FORMAT (Transact-SQL)

返回 SQL Server 2012 中以指定的格式和可选的区域性格式化的值。使用 FORMAT 函数将日期/时间和数字值格式化为识别区域设置的字符串。对于一般的数据类型转换,请使用 CAST 或 CONVERT。

主题链接图标 Transact-SQL 语法约定

语法

FORMAT ( value, format [, culture ] )

参数

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

  • format
    nvarchar 格式模式。

    format 参数必须包含一个有效的 .NET Framework 格式字符串,要么作为标准格式字符串(例如,“C”或“D”),要么作为日期值和数值的自定义字符模式(例如,“MMMM DD, yyyy (dddd)”)。不支持组合格式。有关这些格式模式的完整解释,请查阅有关常规字符串格式、自定义日期和时间格式以及自定义数字格式的 .NET Framework 文档。一个好的起点是主题“格式类型”。

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

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

返回类型

nvarchar 或 null

返回值的长度由 format 确定。

注释

FORMAT 将返回 NULL 错误,而不是非 valid 的 culture。例如,如果 format 中指定的值无效,则返回 NULL。

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

此函数将不会进行远程处理,因为它依赖于 CLR 的存在。远程处理需要 CLR 的函数会导致在远程服务器上出现错误。

下表列出了 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 DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 
  
SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result'; 

下面是结果集。

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

(1 row(s) affected)

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日

(1 row(s) affected)

B. 使用自定义格式字符串执行 FORMAT

以下示例通过指定自定义格式显示格式数值。有关这些格式和其他自定义格式的详细信息,请参阅自定义数字格式字符串

-- Current date is September 27 2012.
DECLARE @d DATETIME = GETDATE();
SELECT FORMAT( @d, 'dd/MM/yyyy', 'en-US' ) AS 'DateTime Result'
       ,FORMAT(123456789,'###-##-####') AS 'Custom Number Result';

下面是结果集。

DateTime Result  Custom Number Result
--------------   --------------------
27/09/2012       123-45-6789

(1 row(s) affected)

C. 用于数值类型的 FORMAT

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

USE AdventureWorks2012;
GO
SELECT TOP(5)CurrencyRateID, EndOfDayRate
            ,FORMAT(EndOfDayRate, 'N', 'en-us') AS 'Number 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

(5 row(s) affected)

此示例指定了德语区域性 (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 €

 (5 row(s) affected)

请参阅

参考

CAST 和 CONVERT (Transact-SQL)