sql - 使用带有 BETWEEN 和空日期参数的 WHERE 子句

标签 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 子句并没有完全按照我想要的方式工作。

最佳答案

当一个或另一个是 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/

相关文章:

sql - 尺寸变化缓慢,总是更新

mysql - SQL 添加行值并据此对结果进行排名

sql-server - 如何重建表以释放已删除旧列使用的空间

python - 使用 pyodbc 将 Raspberry Pi 3 连接到 MSSQL Server

sql-server - 在 where 子句中使用 CASE 时出现语法错误

sql-server - 我的网站托管在不同的服务器上,但我想使用 Azure SQL Server 数据库

sql - 仅选择列包含特定数值的表

MySQL - 行到列

sql - 添加 WHERE 会使 SQL Azure 查询时间增加 20 秒以上

sql-server - 更改大表PK列数据类型