2

我正在寻找最简单的方法来确定DATEoracle 中值的工作日编号,而与 NLS设置无关。

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

有任何想法吗?

4

3 回答 3

8

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);
...
于 2013-06-19T15:32:19.960 回答
0

一种选择是使用所讨论的日期和已知星期一的日期(例如 1900-01-01)之间的剩余天数。

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

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

于 2013-06-19T23:02:16.400 回答
0

我使用MOD(TO_CHAR(SYSDATE, 'J'), 7)(或+1,如果你愿意)。小提琴手

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

于 2021-04-15T21:34:01.627 回答