Вам не нужно использовать иерархический запрос, и вы можете выполнять его независимо от настроек 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 <> Fiddle здесь