将WHERE子句与BETWEEN和null日期参数一起使用

时间:2015-02-11 16:45:31

标签: sql sql-server

我的一个WHERE条款如下:

AND (DateCreated BETWEEN @DateFrom and @DateTo OR (@DateFrom IS NULL OR @DateTo IS NULL))

@DateFrom@DateTo是输入参数,可能是NULL

如果它们都是null,那么我基本上需要忽略BETWEEN并返回所有记录。

如果@DateFromNULL,但@DateToNOT NULL,那么我需要返回DateCreated不大于@DateTo(包括)的所有记录

如果@DateFromNOT NULL,但@DateToNULL,那么我需要返回DateCreated不早于@DateFrom(包括)的所有记录直到今天的日期。

DateCreated不是空字段。

到目前为止,我的WHERE条款并不像我想要的那样工作。

6 个答案:

答案 0 :(得分:9)

当一个或另一个是NULL时,只需要一些额外的标准来处理:

AND (
    (DateCreated >= @DateFrom and DateCreated < DATEADD(day,1,@DateTo)) 
 OR (@DateFrom IS NULL AND @DateTo IS NULL)
 OR (@DateFrom IS NULL AND DateCreated < DATEADD(day,1,@DateTo))
 OR (@DateTo IS NULL AND DateCreated >= @DateFrom)
    )

编辑:Giorgi的方法更简单,在这里适用于DATETIME

AND (       (DateCreated >= @DateFrom OR @DateFrom IS NULL) 
        AND (DateCreated < DATEADD(day,1,@DateTo) OR @DateTo IS NULL)
    )

BETWEEN字段使用<=变量时DATEDATETIME的问题是,将排除最后一天午夜之后的任何时间。< / p>

'2015-02-11 13:07:56.017'大于'2015-02-11'而不是将您的字段转换为DATE进行比较,最好为您的变量添加一天并从<=更改为<

答案 1 :(得分:8)

试试这个:

WHERE ((DateCreated >= @DateFrom OR @DateFrom IS NULL) AND (DateCreated =< @DateTo OR @DateTo IS NULL))

答案 2 :(得分:4)

如何:

DateCreated BETWEEN COALESCE(@DateFrom, DateCreated) AND COALESCE(@DateTo, DateCreated)

答案 3 :(得分:2)

使用此where clause

WHERE  ( DateCreated BETWEEN @DateFrom AND @DateTo )
        OR ( @DateFrom IS NULL
             AND @DateTo IS NULL )
        OR ( @DateFrom IS NULL
             AND DateCreated <= @DateTo )
        OR ( @DateTo IS NULL
             AND DateCreated >= @DateFrom ) 

答案 4 :(得分:0)

这可以简单地通过使用ISNULL函数来完成。

DateCreated BETWEEN ISNULL(@DateFrom,DateCreated) AND ISNULL(@DateTo,DateCreated)

答案 5 :(得分:-1)

AND (DateCreated BETWEEN @DateFrom and @DateTo OR (ISNULL(@DateFrom, '')='' OR ISNULL(@DateTo, '')=''))