您不需要使用分层查询,并且可以独立于 NLS 设置来执行此操作,以 TRUNC( date_value, 'IW' )
查找 ISO 周的开始(始终是星期一)。
( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * 5 / 7
将找到包含开始日期的 ISO 周开始与包含结束日期的 ISO 周开始之间的工作日数。
然后只需添加最后一周的工作日:
+ LEAST( TRUNC( end_date ) - TRUNC( end_date, 'IW' ) + 1, 5 )
并减去开始日期之前第一个 ISO 周的天数:
- LEAST( TRUNC( start_date ) - TRUNC( start_date, 'IW' ), 5 )
综合起来,可得出:
Oracle 设置
CREATE TABLE table_name ( start_date, end_date ) AS
SELECT DATE '2018-12-30' + LEVEL, DATE '2019-01-10'
FROM DUAL
CONNECT BY LEVEL <= 11
询问 :
SELECT TO_CHAR( start_date, 'YYYY-MM-DD "("DY")"') AS start_date,
( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * 5 / 7
+ LEAST( TRUNC( end_date ) - TRUNC( end_date, 'IW' ) + 1, 5 )
- LEAST( TRUNC( start_date ) - TRUNC( start_date, 'IW' ), 5 )
AS Num_Week_Days
FROM table_name;
输出 :
START_DATE | NUM_WEEK_DAYS
:--------------- | ------------:
2018-12-31 (MON) | 9
2019-01-01 (TUE) | 8
2019-01-02 (WED) | 7
2019-01-03 (THU) | 6
2019-01-04 (FRI) | 5
2019-01-05 (SAT) | 4
2019-01-06 (SUN) | 4
2019-01-07 (MON) | 4
2019-01-08 (TUE) | 3
2019-01-09 (WED) | 2
2019-01-10 (THU) | 1
db<>在这里摆弄