13 июля 2015 г.

Последний рабочий день месяца SQL (Oracle)

Стала необходимость определить, является ли заданная дата последним рабочим днём месяца средствами SQL (Oracle). Довольно нетрививальная задачка.

Вот что нарылось:
var psysdate varchar2;
exec :psysdate := to_date('01-MaY-2015','dd-mon-yyyy');

select decode( rtrim(to_char(last_day(:psysdate),'DAY')),
    'SATURDAY',last_day(:psysdate)-1,
    'SUNDAY',last_day(:psysdate)-2,
    last_day(:psysdate)
  ) business_date,
  to_char(
    decode( rtrim(to_char(last_day(:psysdate),'DAY')),
    'SATURDAY',last_day(:psysdate)-1,
    'SUNDAY',last_day(:psysdate)-2,
    last_day(:psysdate)
    ),'DAY'   ) business_day
from dual;
BUSINESS_DATE BUSINESS_DAY
------------- ------------
29-May-2015   FRIDAY
via: http://oracle.ittoolbox.com/groups/technical-functional/oracle-db-l/how-to-get-the-last-business-day-of-a-month-2086576

1 комментарий:

  1. Функция TO_CHAR может возвращать пробелы после строки, чтобы этого избежать нужно поменять строку формата на 'fmDAY'.
    Вот мой вариант:
    CASE TO_CHAR(LAST_DAY(SYSDATE),'fmDAY') WHEN 'SATURDAY' THEN TRUNC(LAST_DAY(SYSDATE)-1) WHEN 'SUNDAY' THEN TRUNC(LAST_DAY(SYSDATE)-2) ELSE TRUNC(LAST_DAY(SYSDATE)) END

    ОтветитьУдалить