Oracle 19c 减去工作日?

问题描述 投票:0回答:1

我在网上搜索一个简单的解决方案,可以像在 Excel 或 Google Sheets 中一样在 Oracle SQL 中减去多个工作日,但似乎唯一的方法是创建函数或精心设计基于 CASE 的算术计算来实现这样的结果。

不过,我看到这些答案大部分来自 2018 年、2019 年等。有没有更新的方法或者这个功能已经包含在基本的Oracle包中了吗?

谢谢,

sql oracle
1个回答
0
投票

如果您的问题是:

如何在开始日期

days
中添加/减去一些工作/业务
dt

您可以:

  • 使用
    TRUNC(dt, 'IW')
    查找一周的开始(始终是周一午夜)
  • 查找日期使用的是从一周开始算起的天数
    dt - TRUNC(dt, 'IW')
  • 找出该日期在一周内使用了多少个工作日/工作日
    LEAST(dt - TRUNC(dt, 'IW'), 5)
    (即采用之前的结果,如果是周六或周日,则只有 4 个工作日)。如果当前日期是星期六或星期日,则将其视为下周的星期一(因为您已经过了本周的星期五)。
  • 将要在日期中偏移的天数与该值相加,得到从一周开始偏移的总工作日数。
  • 每 5 个工作日,在开始日期基础上添加一整周。对于每周的每个部分工作,添加相应的天数。

像这样:

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(周一)

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.