我正在寻找最简单的方法来确定oracle中DATE
值的工作日数,与NLS
设置无关。
Monday -> 1
Tuesday -> 2
…
Sunday -> 7
有什么想法吗?
答案 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 日以来的天数。