我正在SSRS中构建一个报告,我需要让我们的用户过滤不同的日期字段。他们需要能够选择日期过滤器,然后选择该过滤器中的开始和结束日期。
这是我想要实现的简化示例:
SELECT Project.ProjectID, Project.Name, Project.Update_Date, Project.Due_Date, Project.Start_Date, Project.Review_Date
FROM Project
WHERE @datetypefiler BETWEEN @startdate AND @enddate
@datetypefiler基本上等于用户希望过滤的字段(即Project.Update_Date或Project.Due_Date等)
在SSRS上,我为@datetypefiler构建了可以等于各种日期字段的参数,并按预期设置了开始日期和结束日期过滤器。
不幸的是,我似乎不能以这种方式参数化@datetypefiler?然后我尝试使用Case关键字:
SELECT Project.ProjectID, Project.Name, Project.Update_Date, Project.Due_Date, Project.Start_Date, Project.Review_Date
FROM Project
WHERE CASE
when @datetypefiler='Project.Update_Date' then Project.Update_Date BETWEEN @startdate AND @enddate
when @datetypefiler='Project.Due_Date' then Project.Due_Date BETWEEN @startdate AND @enddate
这对我来说也不起作用,我认为不应该在黑暗中拍摄,我应该问一下正确的方法会是什么样子。对此有任何建议将不胜感激,
答案 0 :(得分:2)
您可以尝试这样的事情:
SELECT *
FROM Project
WHERE (@datetypefiler='Project.Update_Date'
AND Project.Update_Date BETWEEN @startdate AND @enddate)
OR (@datetypefiler='Project.Due_Date'
AND Project.Due_Date BETWEEN @startdate AND @enddate)
如果OR
匹配,@datetypefiler
将仅评估完整陈述。
答案 1 :(得分:1)
或者你可以试试这个
SELECT Project.ProjectID, Project.Name, Project.Update_Date, Project.Due_Date,
Project.Start_Date, Project.Review_Date
FROM Project
where
(CASE
when @datetypefiler = 'Project.Update_Date' then Project.Update_Date
when @datetypefiler= 'Project.Due_Date' then Project.Due_Date
END) BETWEEN @startdate AND @enddate
答案 2 :(得分:0)
虽然其他两个答案都可以正常使用,但他们不会使用索引。我建议根据您的条件,使用两个不同的SELECT
语句和两个不同的查询,这样您就可以在Update_Date
和Due_Date
上对您的表进行索引并实际使用它们加快你的查询速度。