Не используйте TO_CHAR
с моделью формата D
для этого, так как это зависит от параметра сеанса NLS_TERRITORY
.
Например, когда SYSDATE = 2018-09-10
(понедельник):
ALTER SESSION SET NLS_TERRITORY = 'France';
SELECT TO_CHAR( SYSDATE, 'D' ) FROM DUAL;
Вывод 1
, но тот же запрос на другой территории:
ALTER SESSION SET NLS_TERRITORY = 'America';
SELECT TO_CHAR( SYSDATE, 'D' ) FROM DUAL;
Выходы 2
.
Вместо этого вы можете использовать TRUNC
и модель формата IW
:
SELECT TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ) FROM DUAL
Вывод 0
для понедельника (и 1
для вторника ... 6
для воскресенья) и не зависит от настройки NLS_TERRITORY
.
Таким образом, вы можете отфильтровать это, чтобы дать выходные дни как:
SELECT *
FROM DUAL
WHERE TRUNC( SYSDATE ) - TRUNC( SYSDATE, 'IW' ) IN ( 5, 6 )
или
SELECT *
FROM DUAL
WHERE SYSDATE - TRUNC( SYSDATE, 'IW' ) >= 5
Если вы хотите, чтобы 1-индексированные дни соответствовали ожидаемому результату от TO_CHAR
(а не 0-индексировались), просто добавьте 1 к значению.