我可以在SQL Server中同时使用like和between子句

时间:2017-08-31 20:52:47

标签: sql sql-server

我在SQL Server中存储了一些包含日期(date数据类型)的数据。我目前正在使用BETWEEN子句来过滤日期范围内的记录,如下所示......

SELECT 
    * 
FROM 
    Report
WHERE 
    ReportDate BETWEEN '2016-08-01' AND '2017-08-01'

是否可以同时使用BETWEENLIKE子句或接近该子句的内容,以便每当用户未指定任何日期时他/她将能够拉出所有报告?到目前为止,下面的查询

SELECT 
    * 
FROM 
    Report
WHERE 
    ReportDate BETWEEN '' AND ''

根本不显示任何记录。有没有办法做到这一点..?

2 个答案:

答案 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);