Чтобы вычислить количество дней между двумя датами без учета выходных в Oracle, вы можете использовать различные методы. Вот несколько подходов с примерами кода:
Метод 1: использование функций TRUNC и LEVEL
SELECT COUNT(*)
FROM (
SELECT TRUNC(start_date + LEVEL) AS date_value
FROM dual
CONNECT BY LEVEL <= (end_date - start_date) + 1
)
WHERE TO_CHAR(date_value, 'D') NOT IN (1, 7);
Метод 2: использование функции NUMTODSINTERVAL
SELECT TRUNC(end_date) - TRUNC(start_date) -
(2 * (TRUNC(end_date, 'IW') - TRUNC(start_date, 'IW'))) AS num_days
FROM dual;
Метод 3: использование функции PL/SQL
CREATE OR REPLACE FUNCTION count_weekdays(start_date DATE, end_date DATE) RETURN NUMBER IS
num_days NUMBER := end_date - start_date + 1;
BEGIN
FOR i IN 0..num_days LOOP
IF TO_CHAR(start_date + i, 'D') IN (1, 7) THEN
num_days := num_days - 1;
END IF;
END LOOP;
RETURN num_days;
END;
Вы можете использовать эту функцию следующим образом:
SELECT count_weekdays(start_date, end_date) AS num_days FROM dual;
Метод 4: использование функций INTERVAL и EXTRACT
SELECT EXTRACT(DAY FROM (end_date - start_date)) -
(2 * EXTRACT(WEEK FROM (end_date - start_date))) AS num_days
FROM dual;