SQL Server 中 DATENAME 默认不返回中文星期名,因其依赖会话语言设置(如需中文须 SET LANGUAGE 'Chinese'),而更可靠的方式是用 CASE + DATEPART 配合 (DATEPART(weekday, @date) + 5) % 7 + 1 映射为“周一=1”,并封装为内联表值函数确保稳定性和性能。

SQL Server 中 DATENAME 默认不返回中文星期名
DATENAME 函数本身只按当前会话语言返回本地化名称,比如设置为简体中文时才可能输出“星期一”,但实际行为依赖 LANGUAGE 设置,而非数据库或服务器默认语言。很多生产环境会话语言仍是 us_english,这时 DATENAME(weekday, GETDATE()) 返回的是 Monday 而非中文。
验证当前语言:SELECT @@LANGUAGE
临时切换语言(仅对当前会话生效):SET LANGUAGE 'Chinese' —— 注意不是 zh-CN,必须用 SQL Server 内置语言名
- 有效值包括:
Chinese、English、Japanese等,大小写不敏感 - 切换后
DATENAME(weekday, '2024-06-10')才可能返回星期一 - 但该设置不会改变
DATEPART(weekday, ...)的数值顺序(仍以SET DATEFIRST为准)
更可靠的方式:用 CASE + DATEPART 映射中文星期
绕过语言依赖,直接用数字映射字符串,可控性强、无环境风险。SQL Server 中 DATEPART(weekday, ...) 返回的数字受 SET DATEFIRST 影响,默认 DATEFIRST 7(周日为 1),但中文习惯通常以周一为起点(即周一 = 1)。
推荐写法(强制周一为第 1 天):
SELECT CASE (DATEPART(weekday, GETDATE()) + 5) % 7 + 1<br> WHEN 1 THEN '星期一'<br> WHEN 2 THEN '星期二'<br> WHEN 3 THEN '星期三'<br> WHEN 4 THEN '星期四'<br> WHEN 5 THEN '星期五'<br> WHEN 6 THEN '星期六'<br> WHEN 7 THEN '星期日'<br>END
- 核心是
(DATEPART(weekday, ...) + 5) % 7 + 1:把默认的“周日=1”转成“周一=1” - 也可先执行
SET DATEFIRST 1,再用DATEPART(weekday, ...)直接得 1~7 - 此方式在任何语言/排序规则下都稳定,适合视图、函数、报表字段复用
封装成内联表值函数(ITVF)复用
如果多处需要,建议封装为 ITVF,避免重复写 CASE。它比标量函数性能好,支持参数化:
CREATE FUNCTION dbo.fn_WeekdayCN(@date DATE)
RETURNS TABLE
AS
RETURN SELECT
CASE (DATEPART(weekday, @date) + 5) % 7 + 1
WHEN 1 THEN '星期一'
WHEN 2 THEN '星期二'
WHEN 3 THEN '星期三'
WHEN 4 THEN '星期四'
WHEN 5 THEN '星期五'
WHEN 6 THEN '星期六'
WHEN 7 THEN '星期日'
END AS WeekdayCN;
调用:SELECT WeekdayCN FROM dbo.fn_WeekdayCN('2024-06-10');
- 不能用
DATENAME封装,因为其结果不可控(依赖会话语言) - ITVF 可被查询优化器内联,无标量函数的行模式执行开销
- 注意:函数中不要用
GETDATE()这类非确定性函数,否则无法用于索引视图
使用 DATENAME 前务必确认会话语言和日期设置
如果坚持用 DATENAME,必须同时检查三项:
-
SELECT @@LANGUAGE—— 必须是Chinese -
SELECT @@DATEFIRST—— 影响DATEPART(weekday, ...)数值,但不影响DATENAME文字内容 -
SELECT DATENAME(weekday, '2024-06-10')—— 实际运行验证,别只查文档
常见陷阱:
– 应用连接字符串里没指定 Language=Chinese,导致会话语言为默认英文
– 在存储过程中未显式 SET LANGUAGE,继承了调用方的语言上下文
– 使用链接服务器查询时,语言设置以远程服务器为准,本地 SET LANGUAGE 无效
中文星期名在不同地区有差异(如台湾用“週一”,大陆用“星期一”),CASE 方式能精准控制用词,DATENAME 则取决于 SQL Server 安装的语言包和系统区域设置。

















