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 中的默认星期几不正确。不一定是星期天,格式 D
的 documentation 明确表示
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')
我有一个任务,我需要 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 中的默认星期几不正确。不一定是星期天,格式 D
的 documentation 明确表示
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')