sql - 如何从 Oracle 获取前一个工作日?
问题描述
我们维护一个表格,列出未来几年的实际假期(Holidays
,有两列:M_DATE
和DESCR
)。我需要找到给定日期之前的最近一天,该表既未列出,也未列出周六或周日。
最好 - 没有循环:) 我该怎么做?
解决方案
您可以使用递归查询。例如,如果您想查找之前的第一个假期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<>在这里摆弄
推荐阅读
- c++ - 每次调用函数时如何逐步读取到下一行?C++
- java - 将信息存储到 2 个不同的数组中
- reactjs - 仅在使用钩子单击按钮时更新反应组件
- python - -215:断言失败 npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'contourArea'
- python - 平滑线 matplotlib:如何用 5 个样本点平滑线?
- java - 为什么Stream.of(ArrayList).foreach的每个元素也是ArrayList?
- sql - 使用 VB.Net 将 excel 中的特定列值导出到数据网格
- amazon-web-services - aws lambda 不使用角色获取凭证具有 AWSLambdaBasicExecutionRole 策略
- c - 如何修复 phy 驱动程序对 devm_kmalloc 的依赖?
- c# - 如何更改 TabPage 的高度?