我在SQL Server中存储了一些包含日期(date
数据类型)的数据。我目前正在使用BETWEEN
子句来过滤日期范围内的记录,如下所示......
SELECT
*
FROM
Report
WHERE
ReportDate BETWEEN '2016-08-01' AND '2017-08-01'
是否可以同时使用BETWEEN
和LIKE
子句或接近该子句的内容,以便每当用户未指定任何日期时他/她将能够拉出所有报告?到目前为止,下面的查询
SELECT
*
FROM
Report
WHERE
ReportDate BETWEEN '' AND ''
根本不显示任何记录。有没有办法做到这一点..?
答案 0 :(得分:7)
将NULL
与参数一起使用...如果没有为@startDate
和@endDate
提供值,那么这些参数的默认值为NULL
,第二个{将满足{1}}条件,返回所有记录。
WHERE
此外,如果您的字段是create proc myProc(@startDate datetime = null, @endDate datetime = null)
as
SELECT * FROM Report
WHERE
(ReportDate BETWEEN @startDate AND @endDate)
or
(@startDate is null and @endDate is null)
,那么this blog by Aaron is well worth your read.
此外,此方法意味着用户必须输入两个参数或两个参数。如果这不是您想要的,请告诉我们。
答案 1 :(得分:0)
我认为正确的逻辑是:
SELECT r.*
FROM Report r
WHERE (ReportDate >= @startDate OR @startDate IS NULL) AND
(ReportDate <= @endDate OR @endDate IS NULL);
仅当其中一个值为NULL
时才有效。
注意:
我会选择Aaron Bertrand的建议并真正使用:
SELECT r.*
FROM Report r
WHERE (ReportDate >= @startDate OR @startDate IS NULL) AND
(ReportDate < DATEADD(day, 1, @endDate) OR @endDate IS NULL);