【问题标题】:Oracle subtract 5 business working days from SYSDATEOracle 从 SYSDATE 中减去 5 个工作日
【发布时间】:2020-05-16 05:56:44
【问题描述】:
SELECT COUNT(1)
    INTO ln_count
    FROM batches eb
    JOIN template_groups ebtg
      ON ebtg.ebtg_id = eb.ebtg_id
   WHERE ebtg.group_name = upper(pvi_batch_group_name)
     AND eb.created_ts > SYSDATE - 5
     AND eb.status = 'COMPLETE';

以上查询仅减去包括周末在内的 5 天,但不确定如何排除周六和周日。

【问题讨论】:

  • 公共假期呢?你必须考虑他们吗?

标签: sql oracle date datetime select


【解决方案1】:

也许这个:

WHERE eb.created_ts > SYSDATE - 7
    AND TO_CHAR(eb.created_ts, 'Dy', 'nls_date_language = american') not in ('Sat', 'Sun')

请注意,此解决方案不考虑公共假期。如果您需要将它们考虑在内,则解决方案会更复杂。

【讨论】:

  • 公司假期怎么样?
  • @EdStevens,这也是我的问题,但是根据上述 cmets created_ts 永远不会是周末(或公共假期,我假设)
  • 可能不是在节假日创建,但节假日的存在会使“5 个工作日”的实际日期发生偏差。因此,在美国,大多数公共假期发生在星期一。因此,如果“创建日期”是在星期一假期后的星期二,则该星期一不计入“5 个工作日”。
【解决方案2】:

这并不容易。我会检查一周中的当前日期并执行条件逻辑来计算需要从中减去多少天:

sysdate 
- case to_char(sysdate, 'fmdy') 
    case 'fri' then 5
    case 'sat' then 6
    case 'sun' then 7
    case 'mon' then 7
    case 'tue' then 7
    case 'wed' then 7
    case 'thu' then 6
end

这可以分解一下:

sysdate 
- case 
    when to_char(sysdate, 'fmdy') = 'fri' then 5
    when to_char(sysdate, 'fmdy') in ('sat', 'thu') then 6
    else 7
end

【讨论】:

    【解决方案3】:

    如果只是 5 个工作日的一种特定情况,那么 5 个工作日通常转换为 7 个日历日。如果您的创建日期不是周末,也许您可​​以使用 7 而不是 5:

    SELECT COUNT(1)
        INTO ln_count
        FROM batches eb
        JOIN template_groups ebtg
          ON ebtg.ebtg_id = eb.ebtg_id
       WHERE ebtg.group_name = upper(pvi_batch_group_name)
         AND eb.created_ts > SYSDATE - 7
         AND eb.status = 'COMPLETE';
    

    【讨论】:

    • 每天只在工作日通过 DBMS 调度程序作业运行批次,所以是的,您的创建日期永远不会落在周末。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多