我在网上搜索一个简单的解决方案,可以像在 Excel 或 Google Sheets 中一样在 Oracle SQL 中减去多个工作日,但似乎唯一的方法是创建函数或精心设计基于 CASE 的算术计算来实现这样的结果。
不过,我看到这些答案大部分来自 2018 年、2019 年等。有没有更新的方法或者这个功能已经包含在基本的Oracle包中了吗?
谢谢,
如果您的问题是:
如何在开始日期
中添加/减去一些工作/业务days
?dt
您可以:
TRUNC(dt, 'IW')
查找一周的开始(始终是周一午夜)dt - TRUNC(dt, 'IW')
LEAST(dt - TRUNC(dt, 'IW'), 5)
(即采用之前的结果,如果是周六或周日,则只有 4 个工作日)。如果当前日期是星期六或星期日,则将其视为下周的星期一(因为您已经过了本周的星期五)。像这样:
SELECT dt,
days,
-- Start of Week
TRUNC(dt, 'IW')
-- Add Full Business Weeks (multiples of 5 days)
+ FLOOR((LEAST(dt - TRUNC(dt, 'IW'), 5) + days)/5) * INTERVAL '7' DAY
-- Add Part Business Weeks
+ LEAST(dt - TRUNC(dt, 'IW'), 5) + days
- FLOOR((LEAST(dt - TRUNC(dt, 'IW'), 5) + days)/5) * 5 AS offset_day
FROM table_name;
对于样本数据:
CREATE TABLE table_name (dt, days) AS
SELECT TRUNC(SYSDATE, 'IW') + 0, -3 FROM DUAL UNION ALL
SELECT TRUNC(SYSDATE, 'IW') + 2.5, -3 FROM DUAL UNION ALL
SELECT TRUNC(SYSDATE, 'IW') + 2, -1 FROM DUAL UNION ALL
SELECT TRUNC(SYSDATE, 'IW') + 3, 2 FROM DUAL UNION ALL
SELECT TRUNC(SYSDATE, 'IW') + 2, 7 FROM DUAL UNION ALL
SELECT TRUNC(SYSDATE, 'IW') + 0.2, 5 FROM DUAL;
输出:
DT | 天数 | OFFSET_DAY |
---|---|---|
2024-09-23 00:00:00(周一) | -3 | 2024-09-18 00:00:00(周三) |
2024-09-25 12:00:00(周三) | -3 | 2024-09-20 12:00:00 (周五) |
2024-09-25 00:00:00(周三) | -1 | 2024-09-24 00:00:00(星期二) |
2024-09-26 00:00:00 (周四) | 2 | 2024-09-30 00:00:00(周一) |
2024-09-25 00:00:00(周三) | 7 | 2024-10-04 00:00:00(周五) |
2024-09-23 04:48:00(周一) | 5 | 2024-09-30 04:48:00(周一) |