FORMAT函数要求SQL Server 2012及以上版本;格式字符串需遵循.NET规范,斜杠等字面量须用单引号转义;性能差,禁用于大表查询和WHERE/JOIN/GROUP BY;支持culture参数但依赖会话语言设置。

FORMAT 函数在 SQL Server 中的最低版本要求
SQL Server 2012 才开始支持 FORMAT 函数,低于这个版本(比如 2008 R2)直接执行会报错:Cannot find either column "sys" or the user-defined function or aggregate "sys.FORMAT"。别急着重写逻辑——先确认版本:SELECT @@VERSION。如果真是老版本,得用 CONVERT + 样式码(如 120、103)拼接,或者用 DATEPART 手动组装。
常见日期格式字符串怎么写
FORMAT 的第二个参数是 .NET 风格的格式字符串,不是 SQL Server 自己那套。容易混淆的是斜杠 / 和横线 -:它们不是分隔符占位符,而是字面量字符,必须加单引号转义,否则会被当成日期分隔符解析失败。
-
FORMAT(GETDATE(), 'yyyy-MM-dd')→ 正确,输出如2024-05-22 -
FORMAT(GETDATE(), 'yyyy/MM/dd')→ 错误,会报Argument data type varchar is invalid for argument 2 of format function -
FORMAT(GETDATE(), 'yyyy''/''MM''/''dd')→ 正确,单引号成对出现表示字面量 -
FORMAT(GETDATE(), 'dd MMM yyyy')→ 输出如22 May 2024(依赖当前会话语言,中文环境才显示“五月”)
性能差到不能在大表 SELECT 中用
FORMAT 是标量函数,且内部调用 .NET CLR,执行开销远高于 CONVERT 或 CAST。在百万行以上表里对日期字段逐行调用 FORMAT,CPU 使用率可能翻倍,查询耗时延长 3–5 倍。线上查询能不用就不用。
- 只在最终结果展示层(比如报表导出、SSRS 参数预览)用
- 避免在 WHERE、JOIN、GROUP BY 中使用,会导致索引失效
- 替代方案:
CONVERT(varchar, OrderDate, 120)得到2024-05-22 14:30:00;需要截断时间部分就套一层CONVERT(date, OrderDate)
语言和文化设置会影响输出内容
FORMAT 第三个可选参数是 culture 字符串,比如 'zh-CN'、'en-US'。不指定时默认取会话 LANGUAGE 设置(可通过 SELECT @@LANGUAGE 查看)。这意味着同一句 SQL,在不同登录用户或不同数据库上下文里,可能输出 “五月” 或 “May”。
-
FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy', 'en-US')→Wednesday, May 22, 2024 -
FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy', 'zh-CN')→星期三, 五月 22, 2024 - 如果传入非法 culture(如
'xx-XX'),会直接报错:The culture parameter 'xx-XX' is not supported
SET LANGUAGE N'Chinese'),否则即使写了 'zh-CN',也可能 fallback 成英文。这点常被忽略。

















