WITH CTE_Event (Event_ID, Event_Start_Time ,Event_End_Time) AS (
SELECT DISTINCT Event_ID,
Event_Start_Time,
isnull(Event_End_Time,GETDATE ( )) --Remplacer par la date courante, si la fin n'est pas connue
FROM dbo.Event
UNION ALL
SELECT Event_ID,
DATEADD(day, 1, Event_Start_Time), --Seule la date de debut sera incrémentée de 1 s'il y a un ecart d'une journee entre le debut et la fin (+Reboucler)
Event_End_Time
FROM CTE_Event WHERE datediff(day,Event_Start_Time,Event_End_Time)<>0 )
SELECT Event_ID,
CASE WHEN ROW_NUMBER()over(PARTITION BY Event_ID ORDER BY Event_Start_Time ,Event_End_Time )<>1
THEN dateadd(dd, -datediff(dd, Event_Start_Time, 1), 1) --On élimine l'information du temps
ELSE Event_Start_Time --Si c'est la 1ere capture de cet événement, on garde l'information temps
END Event_Start_Time,
CASE WHEN datediff(day,Event_Start_Time,Event_End_Time)<>0 --S'il y a un ecart d'au moins une journée entre le debut et la fin de l'evenement
THEN dateadd(s,-1,dateadd(dd, -datediff(dd, Event_Start_Time, 1), 2)) --On met à à 23h59m59 la date de fin
ELSE Event_End_Time
END Event_End_Time
FROM
CTE_Event ORDER BY Event_ID, Event_Start_Time ,Event_End_Time
OPTION (MAXRECURSION 32767);
Partager