问题描述
嗨
最后日期跨越一个周末,因此在工作日是连续的。
好的,所以ID代表一个人,开始日期和结束日期代表假期。我想说ID1人在3/8/2020和5/8/2020之间有假期,13/8/2020 17/8/2020,而不是说ID1人在3号、4号、5号、13号、14号和8月17日有假期,因为这可能很难阅读和格式化。
create table temp_test (ID NUMBER, DATE_STAMP DATE);
insert into temp_test values (1,to_date('03082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('04082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('05082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('13082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('14082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('17082020','ddmmyyyy' ) );
The result needs to be:
ID START_DATE END_DATE
1 03/08/2020 05/08/2020
1 13/08/2020 17/08/2020
最后日期跨越一个周末,因此在工作日是连续的。
好的,所以ID代表一个人,开始日期和结束日期代表假期。我想说ID1人在3/8/2020和5/8/2020之间有假期,13/8/2020 17/8/2020,而不是说ID1人在3号、4号、5号、13号、14号和8月17日有假期,因为这可能很难阅读和格式化。
专家解答
作为工作日的内容往往会随着时间的推移而变化。特别是,许多企业认为公众假期是非工作日。
因此,我建议创建一个表来存储日期,以及它们是否是一般的非工作日:
从那里,您可以将非工作日期合并到输入的日期。这给你一个范围内的所有日期。因此,将您最喜欢的连续行解决方案应用于此。注意您需要检查每个组的开始是一个工作日。
我已经使用match_regnize这样做了:
您可以通过在以下位置找到更多有关挑战的信息:https://blogs.oracle.com/sql/how-to-find-the-next-business-day-and-add-or-subtract-n-working-days-with-sql
这个实时SQL脚本讨论match_regnize连续行解决方案 (并显示其他):https://livesql.oracle.com/apex/livesql/file/content_F8P1XASWD667NDOFJTM74NYE9.html
因此,我建议创建一个表来存储日期,以及它们是否是一般的非工作日:
create table calendar_dates (
calendar_date date
not null
check ( calendar_date = trunc ( calendar_date ) )
primary key,
is_working_day varchar2(1)
not null
check ( is_working_day in ( 'Y', 'N' ) )
);
insert into calendar_dates
with rws as (
select date'2020-07-31' + level dt from dual
connect by level <= 31
)
select dt,
case
when to_char ( dt, 'dy' ) in ( 'sat', 'sun' )
then 'N'
else 'Y'
end
from rws;
commit;从那里,您可以将非工作日期合并到输入的日期。这给你一个范围内的所有日期。因此,将您最喜欢的连续行解决方案应用于此。注意您需要检查每个组的开始是一个工作日。
我已经使用match_regnize这样做了:
with rws as (
select date_stamp, 'Y' is_working_day
from temp_test
union all
select calendar_date, is_working_day
from calendar_dates
where is_working_day = 'N'
)
select *
from rws
match_recognize (
order by date_stamp
measures
first ( date_stamp ) start_date,
last ( date_stamp ) end_date
pattern ( working consecutive* )
define
working as is_working_day = 'Y',
consecutive as date_stamp = prev ( date_stamp ) + 1
);
START_DATE END_DATE
03-AUG-2020 00:00:00 05-AUG-2020 00:00:00
13-AUG-2020 00:00:00 17-AUG-2020 00:00:00 您可以通过在以下位置找到更多有关挑战的信息:https://blogs.oracle.com/sql/how-to-find-the-next-business-day-and-add-or-subtract-n-working-days-with-sql
这个实时SQL脚本讨论match_regnize连续行解决方案 (并显示其他):https://livesql.oracle.com/apex/livesql/file/content_F8P1XASWD667NDOFJTM74NYE9.html
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




