You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL作业答疑:如何将查询结果按周一至周日排序

解决SQL按周一至周日排序的问题

你当前用to_char(hire_date,'DAY')排序是按字符串的字典序排列,自然会出现无序的情况。要实现周一到周日的排序,核心是让每个星期几对应一个连续的排序数字(比如周一=1,周二=2…周日=7),再按这个数字排序。以下是几种可行的修改方式:

方法1:利用日期格式数字调整适配Oracle

Oracle中to_char(hire_date, 'D')默认返回1(周日)到7(周六)的数字,我们可以通过计算调整为周一开头的排序逻辑:

SELECT last_name, hire_date, to_char(hire_date,'DAY') AS "DAY"
FROM employees e
ORDER BY MOD(to_char(hire_date, 'D') + 5, 7) + 1;

原理:通过取模运算将周日的1转为7,周一的2转为1,以此类推,实现周一到周日的排序顺序。

方法2:用CASE语句显式映射排序值

这种方式更直观,不受数据库语言设置影响:

SELECT last_name, hire_date, to_char(hire_date,'DAY') AS "DAY"
FROM employees e
ORDER BY CASE to_char(hire_date, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH')
           WHEN 'MONDAY' THEN 1
           WHEN 'TUESDAY' THEN 2
           WHEN 'WEDNESDAY' THEN 3
           WHEN 'THURSDAY' THEN 4
           WHEN 'FRIDAY' THEN 5
           WHEN 'SATURDAY' THEN 6
           WHEN 'SUNDAY' THEN 7
         END;

添加FM是去除DAY格式自带的空格,NLS_DATE_LANGUAGE=ENGLISH确保返回的星期字符串为英文,避免因数据库语言差异导致匹配失败。

方法3:使用ISO星期格式适配PostgreSQL等数据库

如果使用PostgreSQL这类支持ISO星期的数据库,可直接用extract(isodow from hire_date),该函数返回1(周一)到7(周日)的数字:

SELECT last_name, hire_date, to_char(hire_date,'DAY') AS "DAY"
FROM employees e
ORDER BY extract(isodow from hire_date);

内容的提问来源于stack exchange,提问作者Xavier Pietri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:50:45