如何优化以下SQL函数

时间:2012-05-10 21:34:38

标签: sql sql-server

我正在尝试编写一个函数,它可以返回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 

3 个答案:

答案 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日会返回吗?

如果是这种情况,您必须对“部分”重叠进行更多检查。

在任何一种情况下,都应删除该功能。