我如何找到一个季度的最后一个工作日?没有坐着/太阳。假期很好。
下面给了我上个季度的最后一天,但我需要找到最后一个工作日。
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_TERRITORY
和NLS_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 Sunday
,7 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