0

我正在尝试编写一个可以根据某些日期返回 true 或 false 或 0 或 1 的函数。因此,假设您要检查开始和结束日期,例如“2010 年 3 月 1 日”和“2010 年 3 月 2 日”是否在日期范围内。因此,如果您的日期范围是“2012 年 1 月 1 日 - 2012 年 12 月 30 日”,它将返回 true,否则如果日期范围是“2011 年 1 月 1 日”至 2011 年 12 月 30 日,那么它将返回 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 
4

3 回答 3

2

如果您正在寻找范围重叠,正确的测试将是:

return case when @chkStart <= @rangeEnd 
             and @chkEnd >= @rangeStart
            then 1
            else 0
            end

如果两个范围以任何方式重叠,则此表达式返回 true。

编辑:这里的讨论写得比我做的好得多

但最大的收获是完全删除函数,并直接使用这个表达式(保存案例部分)作为查询中的过滤器,因为这将使查询优化器能够按照其名称进行操作。

于 2012-05-10T21:39:08.293 回答
1

千万不要在这种情况下使用该功能!!直接在您的 sql 中执行并查看差异,这是因为 sql 索引不适用于 sql 函数!!!

于 2012-05-10T22:08:01.843 回答
0

我要看的一件事是您实际上是在查看“完全”重叠还是部分重叠。

例如:如果您检查范围为 3 月 2 日至 3 月 4 日,3 月 1 日至 3 月 3 日是否会返回 true?

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

无论哪种情况,您都应该删除该功能。

于 2012-05-10T22:16:37.280 回答