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
或 @date2
是 null
那么 datediff
将 return null
, 减法将留下 null
最后合并将其变成 0
.
DATEDIFF
counts boundaries 两个 datetime
s 之间的日期边界(午夜转换)和时间部分的相同值一样多删除。所以我们不需要它们作为 DATEDIFF
调用的 date
s。我们确实需要这样来匹配开始日期的非工作日,所以我们在那里保留 CAST
,而且由于数据类型不匹配和对称性,我们对结束日期做同样的事情。
我忽略了当 @date2
小于 @date1
时发生的情况,这可能是此函数的无效输入。
正如我在评论中所说,我更喜欢完整的日历 table 在这里我们可以对工作日进行 COUNT(*)
操作,但请理解这不是一个选项时间给你。 (此时你开始质疑是否需要一个功能)
我正在使用当前计算传入的两个日期之间的 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
或 @date2
是 null
那么 datediff
将 return null
, 减法将留下 null
最后合并将其变成 0
.
DATEDIFF
counts boundaries 两个 datetime
s 之间的日期边界(午夜转换)和时间部分的相同值一样多删除。所以我们不需要它们作为 DATEDIFF
调用的 date
s。我们确实需要这样来匹配开始日期的非工作日,所以我们在那里保留 CAST
,而且由于数据类型不匹配和对称性,我们对结束日期做同样的事情。
我忽略了当 @date2
小于 @date1
时发生的情况,这可能是此函数的无效输入。
正如我在评论中所说,我更喜欢完整的日历 table 在这里我们可以对工作日进行 COUNT(*)
操作,但请理解这不是一个选项时间给你。 (此时你开始质疑是否需要一个功能)