仅计算工作日(不包括周末和公众假期)并添加查询过滤器

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

我想向查询添加一个过滤器,以获取最近 5 个工作日的日期。

declare @DataRetentionPeriod INT =5
  Delete FROM dbo.table1 pt
   WHERE   CONVERT(varchar,pt.ptStampDateTime, 112) < CONVERT( VARCHAR, DATEADD(DAY, @DataRetentionPeriod * -1, GETDATE()), 112) 

所以,我想从 table1 中删除,但希望保留该表中的数据直到最后 5 个工作日,即,如果脚本在星期一运行,那么它不应该在过滤器中计算星期六和星期日,并且应该删除直到上星期五 - 最后的记录周数据不应被删除。如果上周有公共假期,则应再向后移动一天以保留 5 个工作日的数据。

我有一个函数可以给我提供的@date的最后一个工作日-

 select dbo.fn_previous_working_day(@date)

如果日期是今天 - 它将给出昨天 如果日期是星期一 - 则会给出星期五,如果星期五是假期,则会给出星期四

我有另一个函数,如果提供的日期是工作日期,则给出 NULL;如果提供的日期是假期/周末,则给出日期的详细信息

select dbo.fn_working_day(@date)

但我只是无法找到一种方法来添加过滤器来仅计算最近 5 个工作日(或 @dataretentionPeriod 变量中给出的任何数字)

我什至尝试过这个来获取最后 5 个工作日期

declare @i int =0, 
        @date datetime, 
        @newdate datetime, 
        @daten datetime = '2024-04-04', 
        @datet datetime
while @i  <5
Begin
select @date = convert(datetime,convert(varchar, dbo.fn_previous_working_day(@daten-@i),112))
select @datet = convert(datetime,convert(varchar, dbo.fn_previous_working_day(@date),112))
select @newdate = @datet
set @i = @i+1
end
select @newdate

但是它给了我 27-04-2024 而不是 2024-04-26,因为那一周有两个公共假期,并且计数器只跳动 1 天而不是 1 个工作日 - 我怎样才能使计数器跳动 1 个工作日天而不是 1 天

我希望日期过滤器只考虑 5 个工作日,而不是仅考虑 5 天

sql sql-server datetime sql-server-2008-r2 oracle-sqldeveloper
1个回答
0
投票

如果您可以假设(对于大多数国家/地区来说应该没问题)要考虑的最长日历跨度是 10 天,其中我们总能找到 5 个工作日(如果不是,您可以调整):

with Seq as (
select Offset 
from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) T(Offset)
)
, Last10Days as (
  select dateadd(day,-Offset, getdate()) as Dte
  from Seq
  )
  select top 5 *
  from Last10Days L10D
  where dbo.fn_working_day(Dte) is null 
  -- I simulated with this (I don't have your function)
  -- exists
  --       (select 1 as IsWeekDay where datename(weekday, L10D.Dte) not in ('Saturday', 'Sunday'))
  order by Dte desc

我们建立一个最近10天的日历,并用你的功能测试所有,保留工作日,然后取最近的5天

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