如何让SSRS报表的date/time参数忽略时间部分返回当日全部记录?
解决SSRS报表日期参数仅返回00:00:00记录的问题
嗨,这个问题我碰到过好多次了,核心就是要让查询忽略datetime字段的时间部分,匹配用户所选日期的所有记录。给你几个实用的方案,按需选就行:
方案1:直接在查询中截断时间匹配
如果你的数据库是SQL Server(从SSRS场景来看大概率是),可以用两种方式把datetime字段的时间部分去掉,和参数做匹配:
- 简洁版(SQL Server 2008+):利用
DATE类型转换,直接提取日期部分SELECT * FROM YourTargetTable WHERE CAST(YourDateTimeColumn AS DATE) = CAST(@YourDateParam AS DATE) - 兼容版(支持老版本SQL Server):用
DATEADD和DATEDIFF组合截断时间
原理是计算当前日期距离0点的天数,再转回去,就把时间部分清零了。SELECT * FROM YourTargetTable WHERE DATEADD(day, DATEDIFF(day, 0, YourDateTimeColumn), 0) = DATEADD(day, DATEDIFF(day, 0, @YourDateParam), 0)
方案2:用日期范围查询(推荐,性能更好)
上面的方案如果数据量大,可能会因为转换字段导致索引失效。更高效的做法是查询所选日期00:00:00到次日00:00:00之间的所有记录:
SELECT * FROM YourTargetTable WHERE YourDateTimeColumn >= @SelectedDate AND YourDateTimeColumn < DATEADD(day, 1, @SelectedDate)
这里@SelectedDate是用户选择的日期(SSRS里可以把参数默认时间设为00:00:00),这样既包含了当天所有时间点的记录,又能利用YourDateTimeColumn上的索引,查询速度更快。
方案3:调整SSRS参数类型
如果不需要用户选择时间,直接把SSRS的参数类型从DateTime改成Date,这样用户只能选择日期,没有时间部分。然后配合上面的查询语句,就能直接匹配当天所有记录了。
小提醒
优先选方案2,尤其是数据量较大的时候,避免转换字段带来的性能损耗。如果必须用方案1,确保你的字段上没有依赖datetime的索引,或者考虑创建计算列索引。
内容的提问来源于stack exchange,提问作者sql2015
相关产品推荐
相关产品推荐

