Sql 在Oracle中,从周一开始按星期几对员工列表进行排序

Sql 在Oracle中,从周一开始按星期几对员工列表进行排序,sql,database,oracle,date,sql-order-by,Sql,Database,Oracle,Date,Sql Order By,我正在使用oracle中的默认scott模式编写常规sql查询。 使用emp表 在这里,我想根据从周一开始的日期显示和排序结果。i、 e星期一雇佣的人应该是最高层,然后是星期二,一直到星期天 我将此查询编写为: select * from emp order by to_char(hiredate,'DAY') ; 但是上面的查询是按星期几的字母顺序显示结果的,也就是说(星期五雇佣的人排在最前面,然后是星期一、星期六等等) Kinldy帮助。尝试: select * from emp ord

我正在使用oracle中的默认scott模式编写常规sql查询。 使用emp表

在这里,我想根据从周一开始的日期显示和排序结果。i、 e星期一雇佣的人应该是最高层,然后是星期二,一直到星期天

我将此查询编写为:

select * from emp order by to_char(hiredate,'DAY') ; 
但是上面的查询是按星期几的字母顺序显示结果的,也就是说(星期五雇佣的人排在最前面,然后是星期一、星期六等等)

Kinldy帮助。

尝试:

select * from emp order by trunc(hire_date) - trunc(hire_date, 'IW')
这是通过计算从一周开始(从周一开始)经过的天数来实现的。周一返回
0
,周日返回
6


为什么这样做

trunc(hire_date) - trunc(hire_date, 'IW')
这些都在以下文件中:

IW
:ISO 8601标准定义的一年中的日历周(1-52或1-53)。日历周从周一开始

由于此说明符依赖于ISO标准,因此它不受调用它的会话的NLS设置的影响(请进一步了解这可避免的复杂性)。这使得这种方法具有完全的可移植性(并且仍然非常有效,因为它只包含两个转换)


到字符的
方法的问题

Oracle提供了,可与
D
格式说明符一起使用,以返回星期几。如文件所述,此元素取决于会话的NLS区域

报告说:

NLS_TERRITORY
指定日期和周编号要遵循其约定的地区的名称

默认情况下,此会话参数是根据服务器的默认值初始化的。因此,要以可移植的方式使用
D
说明符,首先需要更改会话设置

但请注意,此参数还控制其他会话参数(日期格式、十进制分隔符、货币符号等)的默认值:修改它可能会以令人惊讶的方式影响在同一会话中运行的其他查询

考虑一下这个演示

今天是1月28日星期三,因此是一周的第三天。我们正在创建一个新会话,但未指定任何NLS参数,然后:

SELECT parameter, value from v$nls_parameters WHERE parameter = 'NLS_TERRITORY';

PARAMETER     | VALUE  
:------------ | :------
NLS_TERRITORY | AMERICA
当使用服务器的默认区域(美国)时,我们得到了错误的结果:Oracle认为,在美国,周从周日开始

让我们将参数更改为周从周一开始的区域:

ALTER SESSION SET NLS_TERRITORY = 'FRANCE';
现在我们得到了我们想要的结果。。。但是,您应该知道,在此期间,Oracle将会话参数
NLS\u数字\u字符
更改为
:这是因为
NLS\u数字\u字符
的默认值被隐式更改(当
NLS\u区域
更改时)客户机设置的此参数没有明确的值。狡猾


注意:与
NLS_DATE_LANGUAGE
参数不同,Oracle不允许将
NLS_TERRITORY
作为第三个参数传递给
to_CHAR
(我想这是因为它控制了其他参数的默认值)。

可能
select*from emp order by to_CHAR(hiredate,'D')
@DavidAldridge-这可能在英国有效,但在美国无效。
'D'
选项取决于本地设置(
nls_region
等),这些设置不能作为
to_CHAR
的输入-在美国,星期天=1,星期一=2。@mathguy啊,当然可以!
ALTER SESSION SET NLS_TERRITORY = 'FRANCE';
SELECT TO_CHAR(sysdate, 'd') FROM DUAL;

 | TO_CHAR(SYSDATE,'D') |
 | :------------------- |
 | 3                    |