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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| DECLARE @dateDeb DATETIME,
@dtToday DATETIME,
@heureDeb TINYINT,
@heureMil TINYINT,
@heureFin TINYINT;
SELECT @dateDeb = DATEADD(day, -DAY(GETDATE()), CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)),
@dtToday = CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME),
@heureDeb = 5,
@heureMil = 13,
@heureFin = 21;
WITH
-- Crée la liste des plages horaires entre la date de début et ce matin à minuit
-- sous la forme 2008-09-30 05:00:00.000 | 2008-09-30 13:00:00.000 | 2008-09-30 21:00:00.000
-- pour tous les jours compris entre ces deux dates
CTE_TranchesHoraires (DateDeb, DateMil, DateFin) AS
(
SELECT DATEADD(hour, @heureDeb, @dateDeb), -- DateDeb
DATEADD(hour, @heureMil, @dateDeb), -- DateMil
DATEADD(hour, @heureFin, @dateDeb) -- DateFin
UNION ALL
SELECT DATEADD(day, 1, DateDeb), -- DateDeb
DATEADD(day, 1, DateMil), -- DateMil
DATEADD(day, 1, DateFin) -- DateFin
FROM CTE_TranchesHoraires
WHERE DateFin < @dtToday
),
-- Effectue le calcul du temps de fonctionnement du moteur pendant la première plage horaire
CTE_Poste1 (Tempo)
(
SELECT SUM(StateTime)/3600000 -- Tempo
FROM Runtime.dbo.History
WHERE TagName = 'SysPulse'
AND Value = 1
AND wwRetrievalMode = 'ValueState'
AND wwStateCalc = 'Total'
AND wwCycleCount = 100
AND wwVersion = 'Latest'
AND DateTime BETWEEN CTE_TranchesHoraires.DateDeb AND CTE_TranchesHoraires.DateMil
),
-- Effectue le calcul du temps de fonctionnement du moteur pendant la deuxième plage horaire
CTE_Poste2(Tempo)
(
SELECT SUM(StateTime)/3600000 -- Tempo
FROM Runtime.dbo.History
WHERE TagName = 'SysPulse'
AND Value = 1
AND wwRetrievalMode = 'ValueState'
AND wwStateCalc = 'Total'
AND wwCycleCount = 100
AND wwVersion = 'Latest'
AND DateTime BETWEEN CTE_TranchesHoraires.DateMil AND CTE_TranchesHoraires.DateFin
)
SELECT CTE_Poste1.Tempo,
CTE_Poste2.Tempo; |
Partager