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

goo*_*man 13 sql sql-server

我的一个WHERE条款如下:

AND (DateCreated BETWEEN @DateFrom and @DateTo OR (@DateFrom IS NULL OR @DateTo IS NULL))
Run Code Online (Sandbox Code Playgroud)

@DateFrom并且@DateTo是可能的输入参数NULL.

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

如果@DateFromNULL,但是@DateToNOT NULL的话,我需要与dateCreated会为不大于返回的所有记录@DateTo(含).

如果@DateFromNOT NULL,但是@DateToNULL的话,我需要与dateCreated会是不超过前面返回的所有记录@DateFrom(含)到今天的日期.

DateCreated不是空字段.

到目前为止,我的WHERE条款并不像我想的那样完成.

Har*_* CO 10

只需要一些额外的标准来处理其中一个或另一个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)
    )
Run Code Online (Sandbox Code Playgroud)

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

AND (       (DateCreated >= @DateFrom OR @DateFrom IS NULL) 
        AND (DateCreated < DATEADD(day,1,@DateTo) OR @DateTo IS NULL)
    )
Run Code Online (Sandbox Code Playgroud)

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

'2015-02-11 13:07:56.017' 大于'2015-02-11' 而不是将您的字段DATE用于比较,不如在性能上为变量添加一天并从中更改<=<.


Gio*_*uri 8

试试这个:

WHERE ((DateCreated >= @DateFrom OR @DateFrom IS NULL) AND (DateCreated =< @DateTo OR @DateTo IS NULL))
Run Code Online (Sandbox Code Playgroud)


PRo*_*LeR 7

怎么样:

DateCreated BETWEEN COALESCE(@DateFrom, DateCreated) AND COALESCE(@DateTo, DateCreated)
Run Code Online (Sandbox Code Playgroud)


Pரத*_*ீப் 6

用这个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 ) 
Run Code Online (Sandbox Code Playgroud)