我的一个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
并返回所有记录.
如果@DateFrom
是NULL
,但是@DateTo
是NOT NULL
的话,我需要与dateCreated会为不大于返回的所有记录@DateTo
(含).
如果@DateFrom
是NOT NULL
,但是@DateTo
是NULL
的话,我需要与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
或<=
在DATE
对DATETIME
字段使用变量时的问题是,将排除在最后一天午夜之后的任何时间.
'2015-02-11 13:07:56.017'
大于'2015-02-11'
而不是将您的字段DATE
用于比较,不如在性能上为变量添加一天并从中更改<=
为<
.
试试这个:
WHERE ((DateCreated >= @DateFrom OR @DateFrom IS NULL) AND (DateCreated =< @DateTo OR @DateTo IS NULL))
Run Code Online (Sandbox Code Playgroud)
怎么样:
DateCreated BETWEEN COALESCE(@DateFrom, DateCreated) AND COALESCE(@DateTo, DateCreated)
Run Code Online (Sandbox Code Playgroud)
用这个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)
归档时间: |
|
查看次数: |
31451 次 |
最近记录: |