季度的最后一个工作日



我如何找到一个季度的最后一个工作日?没有坐着/太阳。假期很好。

下面给了我上个季度的最后一天,但我需要找到最后一个工作日。

SELECT TRUNC(SYSDATE, 'Q') - 1 LAST_DAY_OF_LAST_QTR
FROM DUAL

我敢肯定有一个更优雅的解决方案,但这是我想到的:

这是我对您的系统的假设:

  • 工作日是星期一至周五
  • 您一周的第一天从周日的Oracle数据库开始。(这可以根据国家/地区设置进行更改)
with data(r) as
(select 0 r from dual
 union all
 select r+1 from data where r < 6
 )
select max(countingdays) lastbusinessdayofqtr
from (
    select trunc(sysdate, 'Q') - 1 - r countingdays,
           case when to_char(trunc(sysdate, 'Q') - 1 - r,'D') between 2 and 6 then 'Y' else 'N' end BusinessDay
    from data)
    where businessday = 'Y';

with语句会生成数字的行,从0到6。我使用这些数字从本季度的最后一天减去。2至6之间的任何天是星期一至星期五。最后,我以最大的日期为" y"。

这个独立于当前用户NLS_TERRITORYNLS_DATE_LANGUAGE设置:

select decode(to_char(trunc(sysdate,'Q')-1,'Dy', 'NLS_DATE_LANGUAGE = american'),
                     'Sat',trunc(sysdate,'Q')-2, -- for saturday
                     'Sun',trunc(sysdate,'Q')-3, -- for sunday
                       trunc(sysdate,'Q')-1  -- for other days
              ) LAST_DAY_OF_LAST_QTR from dual;

呢?

SELECT NEXT_DAY(TRUNC(SYSDATE, 'Q') - 7, 6) LAST_FRIDAY_OF_LAST_QTR
  FROM DUAL;

最后一天,请参见下面的3个示例查询。

17是星期日(1)和星期六(7)。如果周日/星期六是最后一天,那么它将返回最后一个星期五,否则返回最后一天。

SELECT DECODE(INSTR('17', TO_CHAR(TRUNC(TO_DATE('01-JAN-2019', 'DD-MON-YYYY'), 'Q')-1, 'D'))
               , 0, TRUNC(TO_DATE('01-JAN-2019', 'DD-MON-YYYY'), 'Q')-1, 
                    NEXT_DAY(TRUNC(TO_DATE('01-JAN-2019', 'DD-MON-YYYY'), 'Q') - 7, 6)
              )  LAST_BUSINESS_DAY_OF_LAST_QTR
   FROM DUAL;
SELECT DECODE(INSTR('17', TO_CHAR(TRUNC(TO_DATE('01-AUG-2019', 'DD-MON-YYYY'), 'Q')-1, 'D'))
               , 0, TRUNC(TO_DATE('01-AUG-2019', 'DD-MON-YYYY'), 'Q')-1, 
                    NEXT_DAY(TRUNC(TO_DATE('01-AUG-2019', 'DD-MON-YYYY'), 'Q') - 7, 6)
              )  LAST_BUSINESS_DAY_OF_LAST_QTR
   FROM DUAL;
SELECT DECODE(INSTR('17', TO_CHAR(TRUNC(TO_DATE('01-OCT-2019', 'DD-MON-YYYY'), 'Q')-1, 'D'))
               , 0, TRUNC(TO_DATE('01-OCT-2019', 'DD-MON-YYYY'), 'Q')-1, 
                    NEXT_DAY(TRUNC(TO_DATE('01-OCT-2019', 'DD-MON-YYYY'), 'Q') - 7, 6)
              )  LAST_BUSINESS_DAY_OF_LAST_QTR
   FROM DUAL;

有一个微不足道的解决方案,如果您的季度最后一天是星期天,您将返回2天,或者如果星期六,您将返回1天。然后,借助decode功能,您可以使用:

SQL> col LAST_DAY_OF_LAST_QTR format a22
SQL> select decode(to_char(trunc(sysdate,'Q')-1,'D'),
                         7,trunc(sysdate,'Q')-2, -- for saturday
                         1,trunc(sysdate,'Q')-3, -- for sunday
                           trunc(sysdate,'Q')-1  -- for other days
                  ) LAST_DAY_OF_LAST_QTR from dual;

假设您获得值1 for Sunday7 for saturday

在以下查询中,关于您本地的nls_date_language设置:

select * from
(
 select to_char(sysdate-level,'D') day_num, to_char(sysdate-level,'Day') day
   from dual
  connect by level <= 7
) 
 order by day_num

最新更新