2010-02-02 6 views
3

Table de schémafiltrage lignes SQL

ID  Activate_Date    InActivate_Date 
1  2009-12-18 10:25:19.470 2010-01-13 08:32:30.130 
2  2009-12-18 10:25:19.470 2010-01-13 08:32:30.253 
3  2009-12-18 10:25:19.470 2010-01-13 08:32:30.363 
4  2009-12-18 10:25:19.470 2010-01-13 08:32:30.583 
5  2009-12-18 10:25:19.470 2010-01-13 08:32:30.473 
6  2010-01-13 14:46:53.880 2010-01-13 14:50:45.443 
7  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
8  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
9  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
10  2010-01-13 08:32:30.600 2010-01-13 14:46:23.833 
11  2010-01-13 14:46:53.880 2010-01-13 14:50:45.443 
12  2010-01-13 14:44:56.397 2010-01-13 14:46:23.833 
13  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 
14  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 
15  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 
16  2010-01-13 12:42:59.113 2010-01-13 14:46:23.833 

Paramètres d'entrée:

Declare @StartDate DateTime 
Declare @EndDate DateTime 

Declare @FirstShiftStartTime varchar(8) 
Declare @FirstShiftEndTime varchar(8) 

Set @StartDate = '1/01/2010' 
Set @EndDate = '1/03/2010' 

SET @FirstShiftStartTime = '15:00:00' 
SET @FirstShiftEndTime = '17:00:00' 

sortie:

sortie doivent être toutes les lignes de telle sorte que le filtre de temps doit être appliqué chaque jour sous forme de un changement. Donc, si nous utilisons ces paramètres puis l'eteint doit d'abord 5 lignes d'ID 1 à 5.

Ainsi, dans le filtre de sortie doit être appliqué:

1/01/2010 from 15:00:00 to 17:00:00 
2/02/2010 from 15:00:00 to 17:00:00 
3/03/2010 from 15:00:00 to 17:00:00 

J'espère avoir fait mon auto clair:

J'ai essayé d'utiliser:

((DatePart(Table.Activate_Date) <= @StartDate AND DatePart(Table.INActivate_Date) > @StartDate) OR 
    (DatePart(Table.Activate_Date) >= @StartDate AND DatePart(Table.InActivate_Date) < @EndDate) 
    ) 

AND ((TimePart(Table.Activate_Date) >[email protected]) AND (TimePart(Table.INActivate_Date) < @FirstShiftEndTime)) 

Mais cela ne fonctionnera pas si la date Activer et Désactiver la date couvre plusieurs jours.

Une autre façon que je pourrais trouver est de créer une table de temp avec la boucle chaque jour et puis remplissez la table de temp avec des filtres et puis appliquez la méthode ci-dessus. J'espere qu'il devrait y avoir quelque chose de simple alors je pense.

Toute aide sera grandement appréciée.

Répondre

0

Enfin, je créé un CTE qui contient le filtre DateTime pour chaque jour dans la plage de dates d'entrée et a ensuite rejoint que CTE avec table et appliquer distinctes à obtenir les résultats.

Mise à jour: Pour simple vérification Plage de dates s'il vous plaît utiliser:

dr1.EndDate> = dr2.StartDate et dr1.StartDate < = dr2.EndDate

0

Je ne pense pas que vous pouvez considérer la date et l'heure séparément. Si vous voulez savoir ce qui était actif entre 1500 et 1700 le 02/02/2010, et que la ligne a une date Actif 01/01 et la date Inactive du 03/03, alors elle était active toute la journée du 02/02/02, donc l'heure de début/fin dans la base de données n'est pas pertinente.

Si la date Actif ou Inactif a lieu à la date en question (02/02) alors vous devez prendre en compte l'heure.

Je pense que vous voulez quelque chose de ce pseudo-code:

(ActivateDate < @StartDate OR ( 
     ActivateDate = @StartDate And ActivateTime <= @ShiftStartTime) 
    ) 
and (InActivateDate > @EndDate OR ( 
     InActivateDate = @EndDate And InActivateTime >= @ShiftEndTime) 
    ) 
+0

MikeW merci pour la réponse, mais je dois couper le temps dans chaque jour. Si nous prenons l'exemple ci-dessus, l'entrée avec Activate_Date 1/02/2010 18:00:00 avec Inactive_Date 1/02/2010 20:00:00 ne doit pas être incluse. –