Select * from order as o
where (@datefrom is null or @dateto is null
or o.orderdate between @datefrom and @dateto)
or (@datefrom = o.orderdate)
我想使用datefrom
和dateto
参数进行日期范围选择,或者我可以在01.06.2014
参数中键入datefrom
之类的日期,在这种情况下dateto
1}}将是null
。
这意味着我想将datefrom
参数用于两个过滤器,但是当我在datefrom
参数和dateto is null
中键入特定日期时,根据类型日期数据不正确。
请帮助解决这个问题。
答案 0 :(得分:1)
您的问题是当@datefrom
为null
时,整个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