2014-10-29 96 views
0

我在SSRS中创建报告,应该显示一个月内的事件持续时间。这份报告应该在每个日历月分别进行12次。目前我的选择有12个硬编码选择,每个月都有。我怎样才能做到这一点,重复12次选择,只是迭代开始和结束时间,无论是在SQL语言(适用于视图),或从SSRS更好?谢谢。最后一行SSRS循环选择月份

SELECT DATEDIFF(mi, '2014-01-01 00:00:00.000', end_date) AS total_event 
    FROM MY_TABLE 
    WHERE (start_date <= '2014-01-01 00:00:00.000') AND (end_date BETWEEN '2014-01-01 00:00:00.000' AND '2014-02-01 00:00:00.000') 

    UNION ALL 

    SELECT DATEDIFF(mi, start_date, '2014-02-01 00:00:00.000') AS total_event 
    FROM MY_TABLE 
    WHERE (end_date >= '2014-02-01 00:00:00.000') AND (start_date BETWEEN '2014-01-01 00:00:00.000' AND '2014-02-01 00:00:00.000') 

    UNION ALL 

    SELECT DATEDIFF(mi, '2014-01-01 00:00:00.000', '2014-02-01 00:00:00.000') AS total_event 
    FROM MY_TABLE 
    WHERE (start_date <= '2014-01-01 00:00:00.000') AND (end_date >= '2014-02-01 00:00:00.000') 

    UNION ALL 

    SELECT DATEDIFF(mi, start_date, end_date) AS total_event 
    FROM MY_TABLE 
    WHERE (start_date BETWEEN '2014-01-01 00:00:00.000' AND '2014-02-01 00:00:00.000') AND (end_date BETWEEN '2014-01-01 00:00:00.000' AND '2014-02-01 00:00:00.000') 

回答

0

尝试使用下面的脚本

declare @start datetime 
declare @end datetime 

set @start = '2014-01-01' --firstDay year 
set @end = '2014-12-31' --last Day of year 

;with cte as 
(
select @start firstday, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,DATEADD(month, DATEDIFF(month, 0, @start), 0))+1,0)) lastday, 1 MM 
union all 
select DATEADD(month, DATEDIFF(month, 0, lastday + 1), 0) , DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,DATEADD(month, DATEDIFF(month, 0, lastday + 1), 0))+1,0)), MM + 1 
from cte 
where lastday < @end 
) 
SELECT * FROM CTE C 
--LEFT OUTER JOIN MY_TABLE M ON (M.start_date <= firstday) AND (end_date BETWEEN firstday AND lastday) 

,只需取消注释

--LEFT OUTER JOIN MY_TABLE M ON (M.start_date <= firstday) AND (end_date BETWEEN firstday AND lastday) 
0

你可以试试这个:

SELECT 
    DATEADD(MONTH, DATEDIFF(MONTH, 0, start_date), 0) AS [month], DATEDIFF(MINUTE, DATEADD(MONTH, DATEDIFF(MONTH, 0, start_date), 0), end_date) AS total_event 
FROM 
    MY_TABLE 
WHERE 
    YEAR(start_date) = 2014 
ORDER BY 
    [month];