Освобождение воскресенья от сценария oracle sql - PullRequest
2 голосов
/ 06 января 2020

Пожалуйста, помогите мне проверить скрипт ниже

SELECT CASE
       WHEN to_char(sysdate - 1, 'DAY') = 'SUNDAY' THEN
          trunc(sysdate - 2)
       ELSE
          trunc(sysdate - 1)
       END AS day
  FROM dual

Я вернусь sh, чтобы вернуть 2 дня, если условие в случае истинно, иначе вернуться в предыдущий день, но скрипт продолжает возвращать предыдущий день

Ответы [ 3 ]

3 голосов
/ 06 января 2020

Чтобы удалить все языковые зависимости, вы можете использовать TRUNC(SYSDATE - 1) - TRUNC(SYSDATE - 1, 'IW') для подсчета количества дней с начала iso-недели (которая всегда в понедельник):

SELECT CASE TRUNC( SYSDATE - 1 ) - TRUNC( SYSDATE - 1, 'IW' )
       WHEN 6                                                 -- Sunday
       THEN TRUNC( SYSDATE - 2 )
       ELSE TRUNC( SYSDATE - 1 )
       END AS day 
FROM   DUAL

дб <> скрипку

2 голосов
/ 06 января 2020

Используйте DY - это всегда 3 символа:

SELECT (CASE WHEN to_char(sysdate - 1, 'DY') = 'SUN' 
             THEN trunc(sysdate - 2)
             ELSE trunc(sysdate - 1)
        END) AS day
FROM dual;

Чтобы быть формально правильным, вы должны включить параметр NLS в качестве третьего аргумента ('NLS_DATE_LANGUAGE = American'), чтобы убедиться, что результаты на английском языке sh.

2 голосов
/ 06 января 2020

Когда вы используете TO_CHAR(sysdate-1,'DAY'), тогда результат дополняется пробелами. Попробуйте SELECT '"'||TO_CHAR(sysdate-1,'DAY')||'"', чтобы увидеть эффект.

Используйте Модификаторы модели формата FM, и вы должны также явно указать язык:

TO_CHAR(sysdate-1, 'fmDAY', 'NLS_DATE_LANGUAGE = American') = 'SUNDAY'

или

TRIM(TO_CHAR(sysdate-1, 'DAY', 'NLS_DATE_LANGUAGE = American')) = 'SUNDAY'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...