我正在尝试编写一个函数,它可以返回true或false,或者根据某些日期返回0或1。所以,假设你要检查一下是否开始&结束日期例如“2010年3月1日”& “2010年3月2日”是否在日期范围内。因此,如果您的日期范围是“2012年1月1日 - 2012年12月30日”,那么如果日期范围是“2011年1月1日”至2011年12月30日,它将返回true,那么它将返回false。
目前我使用以下内容,我觉得它没有经过优化,并且在您多次打电话时需要一些时间。
CREATE FUNCTION dbo.tmpfnIsDateInRange (@rangeStart DATETIME,
@rangeEnd DATETIME,
@chkStart DATETIME,
@chkEnd DATETIME)
RETURNS TINYINT
AS
BEGIN
RETURN CASE
WHEN @chkStart BETWEEN @rangeStart AND @rangeEnd
OR @chkEnd BETWEEN @rangeStart AND @rangeEnd
THEN
1
WHEN @chkStart <= @rangeStart AND @chkEnd >= @rangeEnd
THEN
1
ELSE
0
END;
END
答案 0 :(得分:2)
如果您正在寻找范围重叠,正确的测试将是:
return case when @chkStart <= @rangeEnd
and @chkEnd >= @rangeStart
then 1
else 0
end
如果两个范围以任何方式重叠,则此表达式返回true。
修改:here is a discussion written much better than i could ever do。
但最大的好处是完全删除函数,并将此表达式(保存案例部分)直接用作查询过滤器,因为这样可以使查询优化器按照其名称进行操作。
答案 1 :(得分:1)
永远不要在这样的场景中使用这个功能!!直接在你的sql&amp;看到区别,因为sql索引不适用于sql函数!!!
答案 2 :(得分:0)
我要看的一件事是你是否真的在看“完整”重叠或部分重叠。
例如:如果您在3月2日 - 3月4日检查范围,3月1日 - 3月3日会返回吗?
如果是这种情况,您必须对“部分”重叠进行更多检查。
在任何一种情况下,都应删除该功能。