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
相关产品推荐
相关产品推荐

