2009-09-16 7 views
0

Tableau exemple:Plusieurs lignes sélectionnées à partir d'une date allaient ramer

TableName: DownTime

Colonnes:
EventID - int,
ReasonID - int,
StartTime - DateTime,
EndTime - DateTime

Je voudrais calculer le temps d'arrêt quotidien de chaque événement au cours des 30 derniers jours. Cependant, un événement peut être arrêté pendant plusieurs jours, de sorte que l'heure de début pourrait commencer 31 jours avant et pourrait se terminer la semaine suivante. J'ai donc besoin de renvoyer une ligne de données pour cet événement 30 fois. L'événement pourrait aussi durer 10 minutes, j'ai donc besoin d'une rangée de données le montrant. Jusqu'à présent, je n'ai qu'une ligne représentant l'événement entier qui se produit sur 30 jours au lieu de 30 lignes.

MS SQL Server base de données 2005

Merci pour toute aide.

+0

@TBG, certaines de ces réponses vous ont-elles aidé? –

Répondre

1

Vous pouvez créer une table de dimension de date - une table qui est une collection de jours. L'exemple le plus simple absolu pour vos besoins aurait une colonne, date, et vous auriez une ligne pour chaque jour consécutif. Youu pourrait alors se joindre à cette table à votre table d'arrêt:

from dim_date t join downtime d on t.date between convert(varchar(10), d.start_date, 120) and convert(varchar(10), d.end_date, 120) 

De cette façon, si vous avez le temps d'arrêt, vous obtiendrez une ligne pour chaque jour contenant le temps d'arrêt.

+0

J'aime utiliser des tables de nombres, ils ont beaucoup plus d'utilisations qu'une table de date: http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html –

0

Avant d'essayer mon code, vous devez effectuer une configuration unique d'une table Numbers. cela va créer un nom de table numéros avec un numéro de colonne ayant des lignes avec des valeurs de 1 à 10 000:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Numbers 
    FROM sys.objects s1 
    CROSS JOIN sys.objects s2 
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number) 

Ce tableau de nombres est jointe à votre table existante pour « créer » les lignes dont vous avez besoin, essayez ceci:

DECLARE @DownTime table (
EventID int, 
ReasonID int, 
StartTime DateTime, 
EndTime DateTime) 

INSERT INTO @DownTime VALUES (1,1,'9/10/2009 9:00am','9/10/2009 10:00am') 
INSERT INTO @DownTime VALUES (2,1,'9/10/2009 1:00am','9/15/2009 1:00am') 
INSERT INTO @DownTime VALUES (3,1,'9/10/2009'  ,'9/11/2009') 

SELECT 
    d.EventID,d.ReasonID,d.StartTime,d.EndTime 
     , DATEADD(day,Number-1,d.StartTime) AS SequenceDate 
    FROM @DownTime   d 
     INNER JOIN Numbers n ON n.Number<=DATEDIFF(day,d.StartTime,d.EndTime)+1 

SORTIE:

EventID ReasonID StartTime    EndTime     SequenceDate 
------- -------- ----------------------- ----------------------- ----------------------- 
1  1  2009-09-10 09:00:00.000 2009-09-10 10:00:00.000 2009-09-10 09:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-10 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-11 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-12 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-13 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-14 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-15 01:00:00.000 
3  1  2009-09-10 00:00:00.000 2009-09-11 00:00:00.000 2009-09-10 00:00:00.000 
3  1  2009-09-10 00:00:00.000 2009-09-11 00:00:00.000 2009-09-11 00:00:00.000 

(9 row(s) affected) 
Questions connexes