我的一个 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
子句并没有完全按照我想要的方式工作。
最佳答案
当一个或另一个是 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
的变量字段,即最后一天午夜之后的任何时间都将被排除。
'2015-02-11 13:07:56.017'
大于'2015-02-11'
而不是将您的字段转换为 DATE
为了进行比较,最好在变量中添加一天并从 <=
更改,以提高性能。至<
.
关于sql - 使用带有 BETWEEN 和空日期参数的 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28459783/