Calculer la différence de temps entre deux lignes
-
23-09-2019 - |
Question
J'ai une table qui contient les éléments suivants:
DataDate Value
2010-03-01 08:31:32.000 100
2010-03-01 08:31:40.000 110
2010-03-01 08:31:42.000 95
2010-03-01 08:31:45.000 101
. .
. .
. .
I besoin de multiplier la colonne de valeur de la différence de temps entre les rangées actuelle et précédente et que la somme pour toute la journée.
J'ai actuellement les données mis en place pour venir toutes les 10 secondes, ce qui rend pour une simple conversion dans la requête:
SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate
Où @StartDate et @EndDate sont la date d'aujourd'hui à 00:00:00 et 11:59:59.
Avant définir les données à recueillir toutes les 10 secondes ils ont été recueillis chaque fois que la valeur modifiée. Il n'y a pas d'entrées en double en termes de temps, la différence de temps minimum est de 1 seconde.
Comment puis-je configurer une requête pour obtenir le temps écoulé entre les lignes pour le cas où je ne sais pas l'intervalle de temps entre les lectures?
J'utilise SQL Server 2005.
La solution
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY DataDate) AS rn
FROM mytable
)
SELECT DATEDIFF(second, mc.DataDate, mp.DataDate)
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
Dans SQL Server 2012 +:
SELECT DATEDIFF(second, pDataDate, dataDate)
FROM (
SELECT *,
LAG(dataDate) OVER (ORDER BY dataDate) pDataDate
FROM rows
) q
WHERE pDataDate IS NOT NULL
Autres conseils
Un peu tweak sur la requête de Quassnoi si vous préférez ne pas utiliser une sous-sélection serait:
SELECT
DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL