DateTime范围参数有两个where条件

时间:2014-08-28 21:29:46

标签: sql sql-server tsql

Select * from order as o
where (@datefrom is null or @dateto is null  
              or o.orderdate between @datefrom and @dateto)      
       or (@datefrom = o.orderdate)  

我想使用datefromdateto参数进行日期范围选择,或者我可以在01.06.2014参数中键入datefrom之类的日期,在这种情况下dateto 1}}将是null

这意味着我想将datefrom参数用于两个过滤器,但是当我在datefrom参数和dateto is null中键入特定日期时,根据类型日期数据不正确。

请帮助解决这个问题。

3 个答案:

答案 0 :(得分:1)

您的问题是当@datefromnull时,整个where子句的每行评估为True - 因此where子句不是'做任何事情。

以下是实现目标的一种方法:

IF @dateto IS NULL SET @dateto = @datefrom;

Select * from order as o
where o.orderdate >= @datefrom
  and o.orderdate < DATEADD(DAY, 1, @dateto);

请注意,我没有使用between,因为它可能非常含糊不清并且与日期混淆 - 请参阅this article了解原因。

答案 1 :(得分:0)

所以要清楚。如果同时输入@datefrom@dateto,则执行范围检查。如果仅输入@datefrom,则执行相等性检查。如果是这样,这应该有效:

select
    *
from
    order o
where (
    @dateto is not null and
    o.orderdate between @datefrom and @dateto
) or (
    @dateto is null and
    o.orderdate = @datefrom
)

我在你的例子中注意到你还在测试@fromdate为null。这是否意味着什么?

答案 2 :(得分:0)

像这样的查询的更好的解决方案是像这样的动态sql ......

DECLARE @datefrom DATETIME = '20140101' 
DECLARE @dateto   DATETIME = '20140303'

DECLARE @Sql NVARCHAR(MAX);

SET @Sql  = N' Select * from [order] '
          + N' WHERE 1 = 1 '
          + CASE WHEN @datefrom IS NOT NULL 
                  THEN N' AND orderdate >=  @datefrom ' ELSE N' ' END
          + CASE WHEN @dateto IS NOT NULL 
                  THEN N' AND orderdate <=  @dateto   ' ELSE N' ' END 


EXECUTE sp_executesql @Sql
                     ,N'@datefrom DATETIME , @dateto DATETIME'
                     ,@datefrom
                     ,@dateto
相关问题