1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| WITH t AS (
SELECT 1 AS id, cast('2013-01-05' as date) AS date_deb, cast('2013-03-13' as date) AS date_fin, 30 AS qty_par_jour union ALL
SELECT 2 , cast('2013-01-29' as date) , cast('2013-02-10' as date) , 10 union all
SELECT 3 , cast('2012-12-29' as date) , cast('2013-02-10' as date) , 10 union all
SELECT 4 , cast('2012-12-22' as date) , cast('2012-12-29' as date) , 10
),
gen_num as (
select 0 as num
union all
select num + 1
from gen_num
where num + 1 < 12
),
decomp_t as (
select t.*,num,
DATEADD(month, DATEDIFF(month, num, dateadd(month,g.num,t.date_deb)), 0) AS new_date_deb,
DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, dateadd(month,g.num,t.date_deb)) + 1, 0)) as new_date_fin
from t
join gen_num g on g.num <= DATEDIFF(mm,t.date_deb,t.date_fin)
)
select id, new_date_deb, new_date_fin,
DATEDIFF(day,case when new_date_deb > date_deb then new_date_deb else date_deb end,
case when new_date_fin < date_fin then new_date_fin else date_fin end) + 1 as nb_jour,
qty_par_jour,
(DATEDIFF(day,case when new_date_deb > date_deb then new_date_deb else date_deb end,
case when new_date_fin < date_fin then new_date_fin else date_fin end) + 1) * qty_par_jour as qty_periode
from decomp_t
order by id, num |
Partager