WEEKDAY()返回0~6对应周一至周日,非周日=0;转中文用ELT(WEEKDAY(date)+1,'周一','周二','周三','周四','周五','周六','周日');筛选工作日用WEEKDAY(date) BETWEEN 0 AND 4。

WEEKDAY() 返回的数字到底对应星期几?
MySQL 的 WEEKDAY() 函数返回 0~6 的整数,但**不是按“周日=0、周一=1”这种常见习惯**,而是固定以**周一为 0、周日为 6**。这点极易误判——比如你传入 '2024-06-09'(周日),WEEKDAY('2024-06-09') 返回的是 6,不是 0。
常见错误是直接用返回值映射成“周日=0”,结果所有判断全错。如果要兼容日常说法(周日=0),得手动偏移:WEEKDAY(date) % 7 不行,得用 (WEEKDAY(date) + 1) % 7 才能把周一→1、…、周日→0。
怎么把 WEEKDAY() 结果转成中文星期名?
别写冗长的 CASE WHEN 嵌套,用 ELT() 最简洁:它按位置取字符串,刚好匹配 WEEKDAY() 的 0~6 序号。
-
ELT(WEEKDAY('2024-06-10') + 1, '周一', '周二', '周三', '周四', '周五', '周六', '周日')→ 返回'周一' - 注意加
+ 1:因为ELT()从第 1 个参数开始计数,而WEEKDAY()从 0 开始 - 如果日期字段叫
order_date,直接写:ELT(WEEKDAY(order_date) + 1, '周一','周二','周三','周四','周五','周六','周日')
WEEKDAY() 和 DAYOFWEEK() 到底该用哪个?
这是最常被混淆的一对函数:
-
WEEKDAY(date):周一=0,周日=6 —— 适合需要按「工作日/周末」逻辑分组的场景(比如统计周一到周五订单) -
DAYOFWEEK(date):周日=1,周六=7 —— 更贴近日历习惯,但和多数编程语言(如 PHP 的date('w'))不一致 - 二者对 NULL 输入都返回 NULL,行为一致
- 性能无差异,选哪个纯看业务逻辑是否依赖“周一为起点”
WHERE 条件里用 WEEKDAY() 筛选“只查工作日数据”
直接写 WHERE WEEKDAY(create_time) BETWEEN 0 AND 4 就能精准过滤出周一至周五的数据,比用 DAYNAME() 字符串匹配快得多(避免函数索引失效问题)。
但注意:如果 create_time 是 DATETIME 类型,WEEKDAY() 只看日期部分,时分秒不影响结果;如果字段是 TIMESTAMP 且受时区影响,确保 MySQL 会话时区设置正确,否则可能跨日导致 weekday 错位。
真正容易被忽略的是:WEEKDAY() 对非法日期(如 '2024-02-30')返回 NULL,WHERE 条件里若没处理 NULL,这部分记录就静默丢失了——建议先用 IS NOT NULL 显式校验,或用 STR_TO_DATE() 预清洗。


















