计算如何使用 SQL 中的客户函数获取 GETDATE() -4

calculate how to get GETDATE() -4 using customer function in SQL

我的数据库中有一个函数可以像这样吐出一个业务日期...

假设今天是 2020 年 3 月 23 日 - 如果我 运行 这样的函数:

select [dbo].[ufGetBusinessDay] (DATEADD(day, -1,GETDATE()) ,'PREVIOUS') 

它将显示“03/20/2020”(前一个工作日。它知道跳过周末)

如果我做类似

的事情
select [dbo].[ufGetBusinessDay] (DATEADD(day, +1,GETDATE()) ,'NEXT') 

它将显示“03/24/2020”(下一个工作日)

非常简单。这是它唯一的功能。我不知道是否有必要共享代码,因为它有一些与我正在做的事情无关的自定义过滤。就我而言,它只能返回到前一个工作日和下一个工作日。

我的目标是在 proc 中创建一个过滤器,让我像这样回到 4 天前....

Select * from tbl1 where DateField >=DATEADD(dd,-4,GETDATE()) and DateField < GETDATE()

该函数的问题在于,它只能倒退一天,所以虽然这在这种情况下似乎可行,因为我们的最后一个营业日期是星期五 - 4 天

DECLARE @daysago AS DATETIME

SELECT @daysago= [dbo].[ufGetBusinessDay] (DATEADD(day, -1,GETDATE()),'PREVIOUS') 

SELECT DATEADD(DAY,-4,@daysago)

然而,在 GETDATE() 恰好是星期三的 scanario 的情况下,我 运行 该函数将 return 星期二,如果我们这样做 DATEADD(DAY,-4,TUESDAY)将 return 星期天。这里的目标是使用此函数排除周末并实际返回到前一周的星期四。

编辑:我什至不确定是否可以使用此函数在存储过程中完成此操作。我认为实际上可能有必要创建一个单独的过程或函数来执行此类操作,我们检查 DATENAME(WEEKDAY,DATE) 以确定是否是周末,然后利用我必须返回到上一个工作日的函数(不包括周末)同时记录我们已经完成了多少天。

您应该能够将多个函数调用嵌套在一起以返回所需的工作日数。

select 
[dbo].[ufGetBusinessDay] (DATEADD(day, -1, 
    [dbo].[ufGetBusinessDay] (DATEADD(day, -1, 
        [dbo].[ufGetBusinessDay] (DATEADD(day, -1, 
            [dbo].[ufGetBusinessDay] (DATEADD(day, -1, GETDATE()), 'PREVIOUS'), 
        'PREVIOUS'), 
    'PREVIOUS'), 
'PREVIOUS')

您还可以使用一个通用的 table 表达式 (CTE) 递归调用您的函数所需的次数,然后 select 只调用一个值,就像这样。

DECLARE @XDaysAgo DATE;
DECLARE @NumberBusinessDays INT;
SET @NumberBusinessDays = -1;

WITH cte AS
(
    SELECT 0 AS DaysBack, [dbo].[ufGetBusinessDay] (DATEADD(day, -1, GETDATE(), 'PREVIOUS')) AS MyDate
    UNION ALL
    SELECT
          cte.DaysBack - 1
        , [dbo].[ufGetBusinessDay] (DATEADD(day, -1, cte.MyDate, 'PREVIOUS'))
    FROM  cte
    WHERE cte.DaysBack > @NumberBusinessDays
)
SELECT @XDaysAgo = cte.MyDate 
FROM cte WHERE cte.DaysBack = @NumberBusinessDays;