SQL在日期之间选择,但在开始和结束日期为空时显示所有内容

时间:2014-10-21 22:08:37

标签: sql-server date select null between

在SQL中,我可以在字符串上使用通配符'%',而Select语句将显示所有记录,如

select * from tablea where title like '%'

我的问题是如果BETWEEN&中的开始日期和结束日期都是空的。 AND语句中的AND函数。

实施例

`select * from table where inputdate between '2014-01-01'` and '2014-01-31'

它在此语句中正常工作,因为它有开始日期和结束日期。

如果没有任何开始和结束日期,我想显示所有记录怎么办?

select * from table where inputdate between '%' and '%'< ---无法正常工作。

非常感谢。

3 个答案:

答案 0 :(得分:0)

通配符只能用于字符串,但是由于你提到的列是Date,你可以做更好的事情。几乎所有DBMS中都定义了日期最小值/最大值,IDK中有关最大值的定义,但最小值通常是1753年1月1日。因此您可以尝试“1753年1月1日”和“最大日期”之间

答案 1 :(得分:0)

您可以按照inputdate列对照传递的值进行评估的方式编写查询,或者将no值传递给@StartDate变量,只选择最早可能的日期,

我选择1900-01-01作为最早的日期,但根据您的列类型,您可以选择更合适的替代开始日期和结束日期。

DECLARE @StartDate DATE = '2014-01-01'
DECLARE @EndDate   DATE = '2014-01-31'

select * from table 
where inputdate >=  COALESCE(@StartDate, '19000101') 
  and inputdate <=  COALESCE(@EndDate  , '99991231') 

动态SQL

使用可选参数处理这种查询的另一种更好的方法是使用像这样的动态sql ......

DECLARE @StartDate DATE = '2014-01-01'
DECLARE @EndDate   DATE = '2014-01-31'

DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'SELECT * FROM Table 1 = 1 '
          + CASE WHEN @StartDate IS NOT NULL THEN 
           N' AND inputdate >= @StartDate ' ELSE N' ' END
          + CASE WHEN @EndDate IS NOT NULL THEN 
           N' AND inputdate <= @EndDate '   ELSE N' ' END

Execute sp_executesql @Sql 
                     ,N'@StartDate DATE, @EndDate DATE'
                     ,@StartDate
                     ,@EndDate

答案 2 :(得分:0)

SELECT * FROM table t
WHERE t.Date >= IIF(@FromDate IS NULL, t.Date, @FromDate) 
AND t.Date <= IIF(@ToDate IS NULL, t.Date, @ToDate)

工作正常。