SQL Server自定义函数如何实现日期区间判断返回1或0
SQL Server 日期区间判断自定义函数补全
你需要补全的核心日期判断逻辑可以直接通过CASE WHEN搭配区间比较实现,同时原框架存在两处语法问题需要修正:入参定义末尾多余的逗号、SQL Server 不支持//作为行注释符,需要替换为--。
核心判断逻辑
直接在变量定义后添加如下赋值语句即可,默认判断为闭区间,即传入日期等于起止日期时也判定为在范围内:
SET @InsidePeriod = CASE WHEN @procDate BETWEEN @DateIn AND @DateOut THEN 1 ELSE 0 END;
完整可运行示例代码
下面是补全逻辑、修正语法错误后的完整函数,分支查询部分给了示例逻辑,你可以替换成自己的业务查询:
CREATE FUNCTION [dbo].[funcDateBet] ( @procDate datetime -- 删掉了原代码此处多余的逗号 ) RETURNS DateTime AS BEGIN -- 预设区间起止值 DECLARE @DateIn DateTime = '2022-01-01 00:00:00.000'; DECLARE @DateOut DateTime = '2022-08-20 00:00:00.000'; DECLARE @returnval DateTIME; DECLARE @InsidePeriod INT; -- 核心区间判断逻辑 SET @InsidePeriod = CASE WHEN @procDate BETWEEN @DateIn AND @DateOut THEN 1 ELSE 0 END; -- 分支查询逻辑,示例为日期在区间内则返回传入日期+3天,不在则返回传入日期+7天,可替换为实际业务逻辑 IF(@InsidePeriod = 1) SET @returnval = DATEADD(DAY, 3, @procDate); ELSE SET @returnval = DATEADD(DAY, 7, @procDate); RETURN @returnval END GO
注意事项
- 如果业务规则要求不包含结束日期当天(例如截止到2022-08-19 23:59:59),不要使用
BETWEEN写法,避免datetime精度导致的边界数据错判,替换为如下判断逻辑即可:SET @InsidePeriod = CASE WHEN @procDate >= @DateIn AND @procDate < @DateOut THEN 1 ELSE 0 END; - 函数内的分支查询不能执行修改表数据、创建永久对象等有副作用的操作,否则会触发SQL Server的函数语法限制报错。
内容的提问来源于stack exchange,提问作者TechGuy
相关产品推荐
相关产品推荐

