您不需要使用分层查询,并且可以独立于 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 (周一) | 9
2019-01-01 (周二) | 8
2019-01-02 (周三) | 7
2019-01-03 (星期四) | 6
2019-01-04 (周五) | 5
2019-01-05 (周六) | 4
2019-01-06 (太阳) | 4
2019-01-07 (周一) | 4
2019-01-08 (周二) | 3
2019-01-09 (周三) | 2
2019-01-10 (周四) | 1
db小提琴here