Bonjour,

Je dispose d'une table (SECA_ARE) dans laquelle dont enregistrée des évènements.
Elle contient les champs ARE_DEBUT et ARE_FIN de type DATETIME qui contiennent le début et la fin de l'évènement.

Je cherche à totaliser la durée de ces évènements sur une période bornée par @Debut et @Fin.
Pour celà j'utilise la procédure suivante.
Forcément mes bornes peuvent être à cheval entre le début et la fin de l'évènement.
C'est pour celà que j'effectue 4 requêtes consécutives.

Je ne vois pas d'autres solutions mais je me demande s'il n'y a pas plus simple.
Est-ce que celà est judicieux ?
Existe-t-il une autre méthode ?

Merci d'avance.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
29
30
31
32
DECLARE @Ligne AS INT,@Debut AS DATETIME,@Fin AS DATETIME
 
SET @Ligne=1
SET @Debut='06/02/09 06:00'
SET @Fin='06/02/09 14:00'
 
-- Si ARE_DEBUT et ARE_FIN sont compris entre @Debut et @Fin
SELECT datediff(minute,ARE_DEBUT,ARE_FIN)/60.0 DUREE
FROM SECA_ARE
WHERE LIGNE=@Ligne
AND @Debut<=ARE_DEBUT AND ARE_FIN<=@Fin
 
UNION 
-- Si ARE_DEBUT est compris entre @Debut et @Fin
SELECT datediff(minute,ARE_DEBUT,@Fin)/60.0 DUREE
FROM SECA_ARE
WHERE LIGNE=@Ligne
AND @Debut<=ARE_DEBUT AND @Fin>=ARE_DEBUT  AND @Fin<ARE_FIN
 
UNION 
-- Si ARE_FIN est compris entre @Debut et @Fin
SELECT  datediff(minute,@Debut,ARE_FIN)/60.0 DUREE
FROM SECA_ARE
WHERE LIGNE=@Ligne
AND @Debut<=ARE_FIN AND @Fin>=ARE_FIN  AND ARE_DEBUT<@Debut
 
UNION 
-- Si @Debut et @Fin sont compris entre ARE_DEBUT et ARE_FIN
SELECT datediff(minute,@Debut,@Fin)/60.0 DUREE
FROM SECA_ARE
WHERE LIGNE=@Ligne
AND @Debut>ARE_DEBUT AND @Fin<ARE_FIN