我们使用的是 Oracle 11。在我们的 CASE WHEN 语句中,我需要检查两个日期之间的天数是否 > 3 个工作日(不包括周末和节假日)。因此,如果 Date1 = 1/21/19 (
我们正在使用 Oracle 11。
在我们的 CASE WHEN 语句中,我需要检查两个日期之间的天数是否 > 3 个工作日(因此不包括周末和节假日)。
所以,如果
日期 1 = 1/21/19(星期一)
日期 2 = 1/18/19(星期五)
日期 1 和日期 2 之间的工作日数是 1 天,而不是 3 天。
CASE WHEN TO_DATE(SETTLEMENT_DATE, 'YYYY-MM-DD') - TO_DATE(TRADE_DATE,
'YYYY-MM-DD') > 3 THEN 0 --> this includes weekend and holidays
WHEN CODE = 1 THEN 1
WHEN CODE =2 THEN 2
ELSE 3
END AS MyColumn
谢谢。
您可以创建这样的函数,其用途 conditional aggregation
如下
SQL> alter session set NLS_TERRITORY="AMERICA"
SQL> create or replace function get_working_days(
i_settlement_date tab.settlement_date%type,
i_trade_date tab.trade_date%type
) return pls_integer is
o_working_days pls_integer;
begin
select nvl(sum(case when
to_char(trade_date + level,'Dy') in ('Sat','Sun')
then 0
else 1
end ),0)
into o_working_days
from tab
where settlement_date >= trade_date
connect by level <= i_settlement_date - i_trade_date + 1;
return o_working_days;
end;
获取两个日期之间的工作日(包括两个边界日期)。
即,对于您的情况,它将返回 2,包括星期一和星期五。
编辑: 如果您不想创建函数,请使用以下带有替代变量的 &i_settlement_date
查询 &i_trade_date
:
select nvl(sum(case when
to_char(trade_date + level,'Dy') in ('Sat','Sun')
then 0
else 1
end ),0) as working_days
from tab
where settlement_date >= trade_date
connect by level <= &i_settlement_date - &i_trade_date + 1;
并在提示时分别输入样本值 date'2019-01-21'
和 date'2019-01-18'
。