datename(weekday, getdate()) 返回中英文取决于当前会话的language设置:默认为english(如wednesday),执行set language 'chinese'后返回“星期三”;其结果不固定,而datepart(weekday, getdate())返回数字(如3),配合case映射可稳定输出中文星期且不受语言影响。

DATENAME 函数能直接返回星期名称,但结果依赖于当前会话的 LANGUAGE 设置,不是固定中文或英文。
为什么 DATENAME(WEEKDAY, GETDATE()) 有时返回中文,有时返回英文?
SQL Server 根据会话的 LANGUAGE 决定 DATENAME 的返回语言。默认是服务器语言(常为 English),但若执行过 SET LANGUAGE 'Chinese',就会返回“星期一”“星期二”等。
- 检查当前语言:
SELECT @@LANGUAGE - 临时切换为中文:
SET LANGUAGE 'Chinese',之后DATENAME(WEEKDAY, GETDATE())才返回“星期X” - 注意:该设置只对当前会话有效,连接断开即失效
- 不建议在应用层依赖语言切换——容易因连接池复用导致行为不一致
如何稳定获取中文星期名称(不依赖 LANGUAGE)?
用 CASE + DATEPART(WEEKDAY, ...) 映射更可靠,因为 DATEPART(WEEKDAY, ...) 返回的是数字(默认周日=1,周一=2…),不受语言影响。
SELECT
CASE DATEPART(WEEKDAY, GETDATE())
WHEN 1 THEN '星期日'
WHEN 2 THEN '星期一'
WHEN 3 THEN '星期二'
WHEN 4 THEN '星期三'
WHEN 5 THEN '星期四'
WHEN 6 THEN '星期五'
WHEN 7 THEN '星期六'
END AS WeekDayName
- 注意:
DATEPART(WEEKDAY, ...)的起始值受SET DATEFIRST影响(默认 7 表示周日为第一天) - 如需统一按周一为第一天,先执行
SET DATEFIRST 1,此时DATEPART(WEEKDAY, ...)就返回 1~7 对应周一~周日 - 这个方案在视图、函数、存储过程中都稳定,无需担心会话语言漂移
DATENAME 和 FORMAT 的关键区别在哪?
DATENAME 是旧版兼容函数,轻量、快,但语言不可控;FORMAT(SQL Server 2012+)支持文化参数,可强制指定中文,但性能明显更差,尤其在大结果集上。
- 用
FORMAT强制中文星期:FORMAT(GETDATE(), 'dddd', 'zh-CN')→ 返回“星期三” - 但
FORMAT是 CLR 函数,每行调用都有额外开销,千万级表中慎用 -
DATENAME在 WHERE 或 JOIN 条件中可用,FORMAT因无法SARGable,会导致索引失效
最稳妥的做法是:业务逻辑中避免依赖 DATENAME(WEEKDAY, ...) 的字符串输出,优先用 DATEPART(WEEKDAY, ...) 取数字再映射——既规避语言配置风险,又保留索引友好性。如果非要用字符串,且确定环境可控(比如报表专用连接),再考虑 SET LANGUAGE 配合 DATENAME。











