2010-01-08 6 views
3

J'ai une table MS SQL Server qui enregistre les événements d'alarme de notre usine avec une ligne pour chaque alarme et une colonne datetime pour capturer quand l'alarme s'est produite.SQL Server: résultats de groupe sur l'intervalle de temps

Nous gérons notre usine en équipes de 12 heures (de 6 h à 18 h, de 18 h à 6 h) et je dois déterminer le nombre d'alarmes que nous recevons à chaque quart de travail. Comment regrouper mes résultats pour obtenir cela?

Le tableau d'origine ressemble à ceci:

DateTime    Alarm Name 
2010-01-05 14:32:22 Overpressure 
2010-01-05 21:32:59 Underspeed 
2010-01-06 05:58:13 Underspeed 
2010-01-06 06:02:46 Machine Current Fault 

Et nous avons besoin de regrouper les résultats quelque chose comme ceci:

Date  Shift  Count 
2010-01-05 Day  1 
2010-01-05 Night  2 
2010-01-06 Day  1 

Notez que si les alarmes se produisent entre 18 heures le dire 5 janvier et 6 heures le 6 janvier, ils sont comptés comme Night Shift à partir du 5 janvier.

Un conseil?

Répondre

5

Dans cette solution, je calcule les heures de début/fin de travail en soustrayant 6 heures de l'heure de l'événement.

DECLARE @t TABLE 
([DateTime] DATETIME 
,[Alarm Name] VARCHAR(30) 
) 

INSERT @t 
     SELECT '2010-01-05 14:32:22','Overpressure' 
UNION SELECT '2010-01-05 21:32:59','Underspeed' 
UNION SELECT '2010-01-06 05:58:13','Underspeed' 
UNION SELECT '2010-01-06 06:02:46','Machine Current Fault' 



SELECT CONVERT(CHAR(10),DATEADD(hh,-6,[DateTime]),120) AS date 
     ,CASE WHEN DATEPART(hh,DATEADD(hh,-6,[DateTime])) < 12 
      THEN 'day' 
      ELSE 'night' 
     END AS shift 
     ,COUNT(1) AS cnt 
FROM @t 
GROUP BY CONVERT(CHAR(10),DATEADD(hh,-6,[DateTime]),120) 
     ,CASE WHEN DATEPART(hh,DATEADD(hh,-6,[DateTime])) < 12 
      THEN 'day' 
      ELSE 'night' 
     END 
order by 1,2 
+0

c'est parfait - merci pour votre aide – user246211

Questions connexes