过滤BETWEEN字符串参数

时间:2012-11-13 15:54:32

标签: tsql ssrs-2008

我的报告中包含代表Quarters和Years的文本参数。例如,'1Q11'代表2011年第1季度,'2Q13'代表2013年第2季度,依此类推。我也有记录,有一个使用这种格式的字段,'QuarterYear'。

问题是,我需要将其合并到报告中,以便仅在季度和年份介于参数中指定的数据之间时显示数据。例如,如果用户选择“1Q12”和“4Q12”,则报告应显示QuarterYear值为“1Q12”,“2Q12”,“3Q12”和“4Q12”的所有记录。如果用户选择“1Q12”和“2Q13”,则报告应显示QuarterYear值为“1Q12”,“2Q12”,“3Q12”,“4Q12”,“1Q13”和“2Q13”的记录。

对我来说很难,因为这些不是日期值所以我不能使用简单的BETWEEN。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您是否尝试过将1Q12解析为某个日期,在这种情况下将于01/01/2012结束日期为31/03/2012?

当您选择1Q12至3Q12等范围时,请选择2012年1月1日至2012年9月30日之间的报告。

否则(我不是推荐的解决方案),你可以写一个简单的函数,它可以循环运行,找到给定范围之间的所有四分之一。并做一些像增量月份(逐月增量为12,将月份重置为1)并继续运行直到达到范围结束。

答案 1 :(得分:1)

对于一个相对较小的表,最简单的方法可能是使用字符串切片 - 所以你的条件是这样的:

where ...
right(table_quarter,2)+left(table_quarter,1) >= right(@start,2) + left(@start,1) and
right(table_quarter,2)+left(table_quarter,1) <= right(@end,2) + left(@end,1) 
...

请注意,这种情况是不可苛刻的,即。您无法在表格的季度列中使用任何索引。

答案 2 :(得分:1)

如果您可以控制字符串数据的格式化方式,则应考虑将其转换为12Q3而不是3Q12格式,以便简单BETWEEN工作。如果您无法控制该特定字段的格式,则另一个选项可能是根据原始字段以此格式向表中添加计算字段。 =right(QuarterYear,2)+'Q'+left(QuarterYear,1)

在这两种情况下,您都可以将字段编入索引以优化BETWEEN。如果这些都不是可用的选项,那么Mark Ba​​nnister的解决方案可能是最好的。