SSRS:在查询中嵌入@Year参数

时间:2014-02-10 15:50:30

标签: sql sql-server reporting-services

我有一个SSRS报告,该报告使用@Year参数,该参数由用户在运行时选择。

很好,到目前为止,但数据集属性部分中的SQL包含硬编码日期'2010-08-31',但是,它的年份部分需要与@Year参数相同用户选择。换句话说,如果您在2010年运行报告,结果将是正确的,但如果您现在运行(2014年)则不会。

目前的SQL是(需要miminum):

SELECT  DateDiff(Year, birth_dt, '2010-08-31')
--Date of Start of Academic Term
FROM    table99
WHERE  acad_period = @Year

...所以我的问题是,用@Year代替'2010'的正确语法是什么?

编辑:请注意,年份的实际格式为(例如)12 / 13,13 / 14

3 个答案:

答案 0 :(得分:0)

你可以替换

SELECT DateDiff(Year, birth_dt, '2010-08-31')

SELECT DateDiff(Year, birth_dt, @Year+'-08-31')

对当前日期做同样的事情

SELECT DateDiff(Year, birth_dt, DATEPART(yyyy, getdate())+'-' + DATEPART(mm, getdate()) +'-'+DATEPART(dd, getdate()))

答案 1 :(得分:0)

根据您在评论中的澄清,如果您传入'12 / 13',您的查询将是这样的。

SELECT DATEDIFF(Year, birth_dt, '20'+LEFT(@Year,2) + '-08-31')
FROM    table99
WHERE  acad_period = @Year

答案 2 :(得分:0)

由于您的年份参数不是简单的年份值,而是像“13/14”这样的字符串,可能意味着2013/2014学年,我肯定会在查询之外处理它。

使用以下公式将计算出的@TermStart参数添加到数据集中:

=DateSerial(2000 + CInt(Split(Parameters!Year.Value,"/")(0)),8,31)

(只要您预计在2000年之前没有任何日期)

然后您可以在查询中使用@Year和@TermStart参数,如下所示:

SELECT  DateDiff(Year, birth_dt, @TermStart)
--Date of Start of Academic Term
FROM    table99
WHERE  acad_period = @Year

但正如我在上面的评论中提到的,这不是计算年龄的正确方法。有几种方法可以做到这一点。我最喜欢的是:

SELECT  datediff(hour,birth_dt,@TermStart)/8766
--Date of Start of Academic Term
FROM    table99
WHERE  acad_period = @Year