ORDER BY DECODE:解码不会像我想要的那样重新排序日期

ORDER BY DECODE: Decode won't reorder the days like I want it to

我有一个任务,我需要 return 一份特定的报告,然后按天排序,但我需要星期一作为第 1 天(默认情况下,星期日是第 1 天SQL)。这是我的报告和输出代码:

report without order by output without order by

然后我通过解码添加一个顺序,它运行并且看起来正确,但它没有正确地排序日期:

report with order by output with order by

我不知道出了什么问题,所以如果有人能提供帮助,我将不胜感激,谢谢!

"DAY" 是用空白填充 return 编辑的(问 Oracle 为什么他们选择固定长度的字符串 return)。使用 trim("DAY") 代替,这应该有效。也有更简单的方法,但让我们按照您的方式进行。 :-)

您对 Oracle 中的默认星期几不正确。不一定是星期天,格式 Ddocumentation 明确表示

Day of week (1-7). This element depends on the NLS territory of the session.

所以您只需要在您的会话中将 NLS_TERRITORY 设置为每周从星期一开始的某个国家/地区,您就完成了。

如果你有这个需求,可能你的设置已经是这样了,简单检查一下

select * from nls_session_parameters
where parameter like 'NLS_TERRITORY';

如果没有设置适当的区域,例如使用以下语句

 alter session set nls_territory = 'UNITED KINGDOM';

现在您可以在星期几to_char(hire_date, 'd')

订购

例子

select last_name, 
to_char(hire_date, 'DD-MON-RR') "HIRE_DAY",
to_char(hire_date, 'DAY') "DAY",
to_char(hire_date, 'd') day_no
from emp 
order by to_char(hire_date, 'd');

LAST_NAME    HIRE_DAY           DAY                                  D
------------ ------------------ ------------------------------------ -
Mr.Monday    01-MAR-21          MONDAY                               1
Mr.Tuesday   02-MAR-21          TUESDAY                              2
Mr.Wednesday 03-MAR-21          WEDNESDAY                            3
Mr.Thursday  04-MAR-21          THURSDAY                             4
Mr.Friday    05-MAR-21          FRIDAY                               5
Mr.Saturday  06-MAR-21          SATURDAY                             6
Mr.Sunday    07-MAR-21          SUNDAY                               7

使用日期名称 进行排序并不总是被认为是最佳做法,因为它会让你NLS_DATE_LANGUAGE 依赖。

如果你想要一个完全独立的解决方案,那么使用IW 技巧日历周ISO所以它总体上有效。

 order by 1 + TRUNC (hire_date) - TRUNC (hire_date, 'IW')