我的一个WHERE
条款如下:
AND (DateCreated BETWEEN @DateFrom and @DateTo OR (@DateFrom IS NULL OR @DateTo IS NULL))
@DateFrom
和@DateTo
是输入参数,可能是NULL
。
如果它们都是null,那么我基本上需要忽略BETWEEN
并返回所有记录。
如果@DateFrom
为NULL
,但@DateTo
为NOT NULL
,那么我需要返回DateCreated不大于@DateTo
(包括)的所有记录
如果@DateFrom
为NOT NULL
,但@DateTo
为NULL
,那么我需要返回DateCreated不早于@DateFrom
(包括)的所有记录直到今天的日期。
DateCreated不是空字段。
到目前为止,我的WHERE
条款并不像我想要的那样工作。
答案 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
字段使用<=
变量时DATE
或DATETIME
的问题是,将排除最后一天午夜之后的任何时间。< / 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, '')=''))