首页 > 解决方案 > 如何从 Oracle 获取前一个工作日?

问题描述

我们维护一个表格,列出未来几年的实际假期(Holidays,有两列:M_DATEDESCR)。我需要找到给定日期之前的最近一天,该表既未列出,也未列出周六或周日。

最好 - 没有循环:) 我该怎么做?

标签: sqloracle

解决方案


您可以使用递归查询。例如,如果您想查找之前的第一个假期2021-05-02

WITH start_date (dt) AS (
  SELECT DATE '2021-05-02' FROM DUAL
),
days ( dt, day, found ) AS (
  SELECT dt,
         TRUNC(dt) - TRUNC(dt, 'IW'),
         0
  FROM   start_date
UNION ALL
  SELECT dt - CASE day WHEN 0 THEN 3 WHEN 6 THEN 2 ELSE 1 END,
         CASE WHEN day IN (0, 6, 5) THEN 4 ELSE day - 1 END,
         CASE WHEN m_date IS NULL THEN 1 ELSE 0 END
  FROM   days d
         LEFT OUTER JOIN holidays h
         ON ( dt - CASE day WHEN 0 THEN 3 WHEN 6 THEN 2 ELSE 1 END = m_date )
  WHERE  found = 0
)
SELECT dt
FROM   days
WHERE  found = 1;

你的假期表是:

CREATE TABLE holidays ( m_date ) AS
SELECT DATE '2021-04-30' FROM DUAL UNION ALL
SELECT DATE '2021-04-29' FROM DUAL UNION ALL
SELECT DATE '2021-04-28' FROM DUAL UNION ALL
SELECT DATE '2021-04-27' FROM DUAL UNION ALL
SELECT DATE '2021-04-26' FROM DUAL UNION ALL
SELECT DATE '2021-04-23' FROM DUAL;

然后输出是:

DT
2021-04-22 00:00:00

db<>在这里摆弄


推荐阅读