MySQL怎样求周几?一文掌握日期查询技巧
在MySQL中,可以使用WEEKDAY()、DAYOFWEEK()函数或DATE_FORMAT()函数来获取日期对应的星期几信息。 DATE_FORMAT()函数最为灵活实用,能够直接返回“周一”“Monday”等可读格式,而WEEKDAY()返回的是数字索引(0=周一,6=周日),DAYOFWEEK()则按照周日为第1天的顺序返回(1=周日,7=周六),下面将详细解析这三种方法的使用场景和技巧。
三种核心函数详解
WEEKDAY()函数
SELECT WEEKDAY('2023-10-10'); -- 返回0(表示周一)
- 返回数字0-6(0=周一,1=周二,...,6=周日)
- 符合中国习惯的周起始日(周一为一周开始)
DAYOFWEEK()函数
SELECT DAYOFWEEK('2023-10-10'); -- 返回3(表示周二)
- 返回数字1-7(1=周日,2=周一,...,7=周六)
- 符合西方周历习惯
最推荐的DATE_FORMAT()函数
-- 返回英文缩写
SELECT DATE_FORMAT('2023-10-10', '%a'); -- 返回'Tue'
-- 返回英文全称
SELECT DATE_FORMAT('2023-10-10', '%W'); -- 返回'Tuesday'
-- 返回数字(0=周日,1=周一...)
SELECT DATE_FORMAT('2023-10-10', '%w'); -- 返回2
此函数优势明显:可通过格式字符串定制输出,且支持多语言环境。

实际应用场景示例
场景1:查询特定星期几的数据
-- 查找所有周二的数据 SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%W') = 'Tuesday'; -- 使用数字查询(效率更高) SELECT * FROM orders WHERE WEEKDAY(order_date) = 0; -- 周一的数据
场景2:按周几进行分组统计
-- 统计每周各天的订单数量
SELECT
DATE_FORMAT(order_date, '%W') AS week_day,
COUNT(*) AS order_count
FROM orders
GROUP BY DATE_FORMAT(order_date, '%W')
ORDER BY WEEKDAY(order_date);
场景3:中文化星期输出
-- 创建自定义星期映射
CASE DATE_FORMAT(date_column, '%w')
WHEN '0' THEN '周日'
WHEN '1' THEN '周一'
WHEN '2' THEN '周二'
WHEN '3' THEN '周三'
WHEN '4' THEN '周四'
WHEN '5' THEN '周五'
WHEN '6' THEN '周六'
END AS chinese_weekday
性能优化建议
-
索引使用:如果经常按星期几查询,建议创建生成列
ALTER TABLE orders ADD COLUMN weekday_num TINYINT GENERATED ALWAYS AS (WEEKDAY(order_date)) STORED, ADD INDEX (weekday_num);
-
避免函数包裹列名:WHERE子句中函数包裹列会导致索引失效
-- 不推荐(索引失效) SELECT * FROM orders WHERE WEEKDAY(order_date) = 0; -- 推荐:使用范围查询 SELECT * FROM orders WHERE order_date >= '2023-10-09' AND order_date < '2023-10-10';
特殊注意事项
- 时区影响:日期函数受MySQL时区设置影响,确保业务时区与数据库时区一致
- 性能权衡:DATE_FORMAT()功能强大但开销较大,大数据量时考虑预计算
- 跨版本兼容:MySQL 8.0对日期函数有优化,低版本需要注意性能问题
掌握MySQL求周几的三种方法后,推荐在日常开发中优先使用DATE_FORMAT()函数,因其灵活性最强,对于高性能要求的场景,可考虑使用WEEKDAY()配合预计算字段,根据实际需求选择合适的函数,既能保证功能实现,又能兼顾查询效率。
通过本文的介绍,相信您已经能够熟练运用MySQL处理日期查询中的星期几问题,在实际数据库操作中游刃有余。
未经允许不得转载! 作者:HTML前端知识网,转载或复制请以超链接形式并注明出处HTML前端知识网。
原文地址:https://www.html4.cn/7183.html发布于:2026-07-27





