我想向查询添加一个过滤器,以获取最近 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 天
如果您可以假设(对于大多数国家/地区来说应该没问题)要考虑的最长日历跨度是 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天