我正在寻找最简单的方法来确定DATE
oracle 中值的工作日编号,而与 NLS
设置无关。
Monday -> 1
Tuesday -> 2
…
Sunday -> 7
有任何想法吗?
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);
...
一种选择是使用所讨论的日期和已知星期一的日期(例如 1900-01-01)之间的剩余天数。
mod(my_date-date '1900-01-01',7)+1 day_of_week
您必须选择一个合适的古老星期一,以便您使用的所有日期都大于或等于它。
我使用MOD(TO_CHAR(SYSDATE, 'J'), 7)
(或+1,如果你愿意)。小提琴手
J 代表儒略日;自公元前 4712 年 1 月 1 日以来的天数。