我想从一张表中找出每个假期的最后一个工作日。例如,我有一张表,它具有以下结构:
create table t1( a char(8),
b varchar2(40),
c varchar2(90), d char(8));
Insert into t1 values ('w','Feb 1', 'Tuesday','l');
....
Insert into t1 values ('H', 'Feb 3', 'sat','j');
Insert into t1 values ('H', 'Feb 4', 'sun','k');
Insert into t1 values ('H', 'Feb 5', 'mon', 'o');
我的要求是,每当我尝试为假期获取数据时(本例中为H
),我需要取上一个工作日的值(在本例中为w
)。简单地说,星期六和星期日的期望值应该是星期五的值。注意,insert语句将星期一也作为假日,我希望星期五的d列也作为星期一的输出。请帮助我在Oracle SQL中满足此要求。
2条答案
按热度按时间lkaoscv71#
在Oracle 12中,您可以使用
MATCH_RECOGNIZE
查找所有假日,并从假日的第一天减去1天,以获得前一个最后一个工作日(假设日历表列出了每一天):其中,对于示例数据:
输出:
| 最后工作日|
| - ------|
| 2023年2月3日00时00分|
| 2023年2月10日00时00分|
fiddle
njthzxwz2#
(设置环境;你不必这样做):
由于
t1
包含整个日历,并且日期被标记为working days或holidays,因此您可以使用相关子查询(查询中的第3 - 7行)来获取该表中任何其他日期之前的工作日。您使用的列名(a,B,c,d)描述性不强,因此我尝试进行了改进:
status
是w
或h
datum
为 * 日期 *;其数据类型是(且应该是)date
;如果您使用了varchar2
列,请不要这样做。如果表包含两个(或更多)年份,并且您在其中存储了Feb 3
-该日期属于哪一年?day_name
可能是多余的,因为您可以使用to_char
函数从datum
中获取该值,但是好吧,让我们离开它