2011-03-06 12 views
5

ser principalmente un desarrollador de C#, estoy rascándome la cabeza al intentar crear una solución basada pura T-SQL para un problema que involucra resumiendo día/mes dado un conjunto de intervalos de fechas.Resumir días por mes en base a intervalos de fechas

que tienen un conjunto de datos buscando algo como esto:

UserID Department StartDate EndDate 
====== ========== ========== ========== 
1  A   2011-01-02 2011-01-05 
1  A   2011-01-20 2011-01-25 
1  A   2011-02-25 2011-03-05 
1  B   2011-01-21 2011-01-22 
2  A   2011-01-01 2011-01-20 
3  C   2011-01-01 2011-02-03 

Los rangos de fechas no se solapan, puede durar varios meses, pueden existir varios rangos para un usuario y departamento específico dentro de un solo mes . Lo que me gustaría hacer es resumir el número de días (inclusive) por usuario, departamento, año y mes, así (con las reservas de los errores matemáticos en mi ejemplo ...):

UserID Department Year Month Days 
====== ========== ==== ===== ==== 
1  A   2011 01  10 
1  A   2011 02  4 
1  A   2011 03  5 
1  B   2011 01  2 
2  A   2011 01  20 
3  C   2011 01  31 
3  C   2011 02  3 

Esta información va a una nueva tabla utilizada por las herramientas de informes. Espero que la descripción del problema sea lo suficientemente clara, esta es mi primera publicación aquí, sea gentil :-)

Gracias de antemano!

Respuesta

8

muestra de trabajo

-- sample data in a temp table 
declare @t table (UserID int, Department char(1), StartDate datetime, EndDate datetime) 
insert @t select 
1 ,'A', '2011-01-02','2011-01-05'union all select 
1 ,'A', '2011-01-20','2011-01-25'union all select 
1 ,'A', '2011-02-25','2011-03-05'union all select 
1 ,'B', '2011-01-21','2011-01-22'union all select 
2 ,'A', '2011-01-01','2011-01-20'union all select 
3 ,'C', '2011-01-01','2011-02-03' 

-- the query you need is below this line  

select UserID, Department, 
    YEAR(StartDate+v.number) Year, 
    MONTH(StartDate+v.number) Month, COUNT(*) Days 
from @t t 
inner join master..spt_values v 
    on v.type='P' and v.number <= DATEDIFF(d, startdate, enddate) 
group by UserID, Department, YEAR(StartDate+v.number), MONTH(StartDate+v.number) 
order by UserID, Department, Year, Month 
+0

Gracias! Funciona bien, el uso interesante de ** master..spt_values ​​** no se ha encontrado anteriormente con esa tabla del sistema. Se puede encontrar más información sobre ** master..spt_values ​​** [aquí] (http://stackoverflow.com/questions/4273723/what-is-the-purpose-of-system-table-table-master-spt- values-and-what-are-the-mea). –

+0

+1 para usar la "Tabla de conteo" original. ;-) –

Cuestiones relacionadas