See if what I am showing below is sort of what you are looking for. In the code below, the #MaintenanceTable is a sample table of your data that I made up. The #Calendar table is a calendar table that has one row for each day that is of interest to you.-- CREATE A CALENDAR TABLE.CREATE TABLE #Calendar(Dt DATE NOT NULL PRIMARY KEY CLUSTERED);;WITH N(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM N WHERE n < 50)INSERT INTO #Calendar SELECT DATEADD(dd,n-1,'20120701') FROM N OPTION (MAXRECURSION 0);-- CREATE AND POPULATE A SAMPLE MAINTENANCE TABLECREATE TABLE #MaintenanceTable( TMP_EQUIPAMENTO INT, TMP_DT_INICIO DATETIME, TMP_DT_FIM DATETIME);INSERT INTO #MaintenanceTable VALUES(1, '2012-07-11 20:00:00.000', '2012-07-18 11:00:00.000'),(2, '2012-07-21 20:00:00.000', '2012-07-21 23:00:00.000'),(3, '2012-07-27 20:00:00.000', '2012-07-28 20:00:00.000')-- QUERYSELECT Dt, TMP_EQUIPAMENTO, CASE WHEN TMP_DT_INICIO < DATEADD(dd,1,dt) AND TMP_DT_FIM > Dt THEN DATEDIFF ( hh, CASE WHEN TMP_DT_INICIO < Dt THEN Dt ELSE TMP_DT_INICIO END, CASE WHEN TMP_DT_FIM > DATEADD(dd,1,dt) THEN DATEADD(dd,1,dt) ELSE TMP_DT_FIM END ) ELSE 0 END AS HoursFROM #Calendar c CROSS APPLY ( SELECT TOP 1 TMP_EQUIPAMENTO,TMP_DT_INICIO ,TMP_DT_FIM FROM #MaintenanceTable m WHERE m.TMP_DT_INICIO < DATEADD(dd,1,c.Dt) AND TMP_DT_FIM > c.Dt ORDER BY TMP_DT_INICIO DESC ) mORDER BY TMP_EQUIPAMENTO, Dt;DROP TABLE #CalendarDROP TABLE #MaintenanceTable
If this is not what you are looking for, create code that someone can copy and run on their computer (just like you can copy and run the code I posted) which creates sample data and shows your expected output.