【问题标题】:How to find last 7 working/week days in Oracle SQL?如何在 Oracle SQL 中查找最后 7 个工作日/工作日?
【发布时间】:2021-08-12 17:30:18
【问题描述】:

我有一张表格,其中包含过去 10 年和未来 20 年的日期。我想参考今天(sysdate)计算日期是否在最近 7 个工作日(周)内,如下面的示例表所示(填充最后一列 IsInLast7WorkingDays)。

假设:周六和周日是非工作日。

TODAY       CAL_DATE  ISWEEKDAY   IsInLast7WorkingDays
8/12/2021   8/1/2021      N             N
8/12/2021   8/2/2021      Y             N
8/12/2021   8/3/2021      Y             Y
8/12/2021   8/4/2021      Y             Y
8/12/2021   8/5/2021      Y             Y
8/12/2021   8/6/2021      Y             Y
8/12/2021   8/7/2021      N             N
8/12/2021   8/8/2021      N             N
8/12/2021   8/9/2021      Y             Y
8/12/2021   8/10/2021     Y             Y
8/12/2021   8/11/2021     Y             Y
8/12/2021   8/12/2021     Y             N
8/12/2021   8/13/2021     Y             N
8/12/2021   8/14/2021     N             N
8/12/2021   8/15/2021     N             N
8/12/2021   8/16/2021     Y             N
8/12/2021   8/17/2021     Y             N
8/12/2021   8/18/2021     Y             N
8/12/2021   8/19/2021     Y             N
8/12/2021   8/20/2021     Y             N

TODAY       CAL_DATE  ISWEEKDAY   IsInLast7WorkingDays
8/14/2021   8/1/2021      N             N
8/14/2021   8/2/2021      Y             N
8/14/2021   8/3/2021      Y             N
8/14/2021   8/4/2021      Y             N
8/14/2021   8/5/2021      Y             Y
8/14/2021   8/6/2021      Y             Y
8/14/2021   8/7/2021      N             N
8/14/2021   8/8/2021      N             N
8/14/2021   8/9/2021      Y             Y
8/14/2021   8/10/2021     Y             Y
8/14/2021   8/11/2021     Y             Y
8/14/2021   8/12/2021     Y             Y
8/14/2021   8/13/2021     Y             Y
8/14/2021   8/14/2021     N             N
8/14/2021   8/15/2021     N             N
8/14/2021   8/16/2021     Y             N
8/14/2021   8/17/2021     Y             N
8/14/2021   8/18/2021     Y             N
8/14/2021   8/19/2021     Y             N
8/14/2021   8/20/2021     Y             N

提前致谢。

编辑:我想我应该提到我已经有一个包含日期和“isweekday”的表格。今天是从以下查询中的 sysdate 派生的。

select b.today, a.cal_date, a.isweekday
from DATE_SRK a, (select trunc(sysdate)+4 today from dual) b
order by a.cal_date;

【问题讨论】:

  • 而且您要每天修改表格中的这些日期?你为什么不把 ISWEEKDAY 和一些 sysdate 比较结合起来得到最后 7 天?
  • @CaiusJard - 不,我已经有一个包含日期和“isweekday”的表格。我正在构建查询,今天是 sysdate。 select b.today, a.cal_date, a.isweekday from DATE_SRK a, (select trunc(sysdate)+4 today from dual) b order by a.cal_date;

标签: sql oracle plsql


【解决方案1】:

如果我理解正确,你可以使用row_number()case逻辑:

select t.*,
       (case when isweekday = 'N' then 'N'
             when cal_date > today then 'N'
             when row_number() over (partition by isweekday, (case when cal_date > today then 1 else 0 end)
                                     order by cal_date desc
                                    ) <= 7
             then 'Y'
             else 'N'
        end) as IsInLast7WorkingDays
from t;

row_number() 的技巧是仅枚举 'Y' 且小于或等于今天的行(前两个 case 条件将其他行设置为 'N')。

【讨论】:

  • @Gordon_Linoff 你太棒了!该查询完全按照我想要的方式工作。
  • 这是对 row_number() 和分区的巧妙使用。非常感谢您的帮助?
【解决方案2】:

问题是“workingDay”的抽象,假期呢?

我不知道有什么方法可以在数据库中获得假期,您需要一个带有这些的预定义表。

如果您将工作日限制为“周一至周五”,那么您可以使用递归 SQL 生成表表达式来获取它们。

【讨论】:

    【解决方案3】:

    类似这样的表达式可能在查询中起作用:

    SELECT T_Dates.*, 
    IIf(Weekday([T_Dates]![TODAY],2)<6 
    And 
    IIf([T_Dates]![TODAY]>=DateAdd("d",-9,Now()),1,0)=1,1,0) 
    AS [Weekday & Last 7 Days]
    FROM T_Dates;
    

    在此示例中,T_Dates 是一个包含您之前显示的数据的表。 如果 [TODAY] 是查询运行之日起最近 9 天内的工作日,则返回 1,否则返回 0。

    【讨论】:

    • 我认为这是 SQL Server 查询,但我会看看是否可以尝试在 Oracle 中构建类似的东西。
    猜你喜欢
    • 2017-01-20
    • 2018-03-20
    • 2020-03-26
    • 2014-08-09
    • 1970-01-01
    • 2014-11-12
    • 2016-09-23
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多