无论NLS设置如何,工作日编号

时间:2013-06-19 15:17:53

标签: sql oracle oracle11g

我正在寻找最简单的方法来确定oracle中DATE值的工作日数,与NLS设置无关。

Monday  -> 1
Tuesday -> 2
…
Sunday  -> 7

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

ISO周从星期一开始;他们不使用NLS设置。我认为这个表达是可靠的。

1 + trunc(your_date) - trunc(your_date, 'IW')

显示算术的工作原理。 。 。 current_date是星期三。

select current_date as cur_date
     , trunc(current_date) as trunc_cur
     , trunc(current_date, 'IW') as trunc_iso
     , trunc(current_date) - trunc(current_date, 'IW') as date_diff
     , 1 + trunc(current_date) - trunc(current_date, 'IW') as dow
from dual

CUR_DATE                    TRUNC_CUR                  TRUNC_ISO                   DATE_DIFF  DOW
June 19 2013 16:01:51+0000  June 19 2013 00:00:00+0000 June 17 2013 00:00:00+0000  2          3

一般情况下,如果找不到合理按预期表达的表达式,则可以始终使用表格。 (或许,一种将SQL与底层实现隔离开来的函数。)

所以你总是可以使用像

这样的东西
create table weekday_numbers (
  weekday char(3) not null primary key,
  weekday_num integer not null unique
    check(weekday_num between 1 and 7)
);

insert into weekday_numbers values ('Mon', 1);
...

答案 1 :(得分:0)

一种选择是使用相关日期与已知星期一日期之间天数差异的剩余部分(例如1900-01-01)。

mod(my_date-date '1900-01-01',7)+1 day_of_week

您必须选择一个适当的古老星期一,以便您使用的所有日期都大于或等于它。

答案 2 :(得分:0)

我使用 MOD(TO_CHAR(SYSDATE, 'J'), 7)(或 +1,如果您愿意)。 dbfiddle

J 代表 儒略日;自公元前 4712 年 1 月 1 日以来的天数