SQL 函数检查日期是否介于另一个 table 的 2 个日期之间

SQL Function check if a date is between 2 dates from another table

我正在使用当前计算传入的两个日期之间的 SLA 的函数,这会检查 NULL 项目和 returns 0.

我现在需要考虑新 table 'NonBusinessDays' 中的日期,并将它们从总 SLA 值中扣除。

我如何检查两个传入的值是否包含它们与其他 tables 日期之间的范围内的任何日期,如果它们包含,则需要从 SLA 总数中扣除该日期。

目前 table 坐得像;

CREATE TABLE #NonBusinessDays(
    [id] [uniqueidentifier] NOT NULL,
    [date] [date] NOT NULL,
    [name] [nvarchar](100) NOT NULL,
    [type] [nvarchar](50) NOT NULL)
GO

INSERT INTO #NonBusinessDays
           ([id]
           ,[date]
           ,[name]
           ,[type])
     VALUES
           ('1DF6A335-56F8-4DA7-B9C3-07DBAC9FBA8D'
           ,'2019-08-26'
           ,'Summer bank holiday'
           ,'PublicHoliday')

           ('0940FDC9-A875-48C5-BED8-0ABFA3AA5AE8',
            '2018-05-07',
            'Early May bank holiday',
            'PublicHoliday')
GO

所以我的函数是这样的;

CREATE FUNCTION dateSLA
(
@date1 DATETIME,
@date2 DATETIME
)
returns INT
AS 
BEGIN

declare @days INT
set @days = 0

      IF @date1 IS NULL AND @date2 IS NULL
            BEGIN
            GOTO Final
      END
      ELSE IF @date1 IS NOT NULL AND @date2 IS NOT NULL
      BEGIN


            SET @days = DATEDIFF(DAY, CONVERT(DATE, @date1, 103), CONVERT(DATE, @date2, 103))

            GOTO Final
      END

Final:

return @days

END
GO

我希望它检查 NonBusinessDays Table 中的任何日期是否存在于传递给函数的参数之间,然后它会花费 SLA 的天数。

例如,如果 BusinessDays 中的两个日期存在于传入的参数之间,那么这将减去 2 个。因此,SLA 计算为 10,但由于存在 2 个非工作日,因此计算结果为 8。

任何指导将不胜感激,如果您需要更多信息,请告诉我,我会进行修改。

我们可以大大减少此功能并考虑到非工作日:

CREATE FUNCTION dateSLA
(
@date1 DATETIME,
@date2 DATETIME
)
returns INT
AS 
BEGIN

return COALESCE(
  DATEDIFF(day,@date1,@date2) -
  (select COUNT(*) from #NonBusinessDays
   where date between CAST(@date1 as date) and CAST(@date2 as date)),
  0)

END
GO

如果 @date1@date2null 那么 datediff 将 return null, 减法将留下 null 最后合并将其变成 0.

DATEDIFF counts boundaries 两个 datetimes 之间的日期边界(午夜转换)和时间部分的相同值一样多删除。所以我们不需要它们作为 DATEDIFF 调用的 dates。我们确实需要这样来匹配开始日期的非工作日,所以我们在那里保留 CAST,而且由于数据类型不匹配和对称性,我们对结束日期做同样的事情。

我忽略了当 @date2 小于 @date1 时发生的情况,这可能是此函数的无效输入。

正如我在评论中所说,我更喜欢完整的日历 table 在这里我们可以对工作日进行 COUNT(*) 操作,但请理解这不是一个选项时间给你。 (此时你开始质疑是否需要一个功能)