2017-05-23 1 views
1

J'ai deux tables avec des plages horaires, semaines et périodes: Semaines:SQL Server - vérifier si des jeux de plages horaires se chevauchent

WeekID | StartDate | EndDate | 
1  | 2017-01-01 | 2017-01-07 | 
2  | 2017-01-08 | 2017-01-14 | 
3  | 2017-01-15 | 2017-01-21 | 

et périodes:

PeriodID | StartDate | EndDate | 
1  | 2016-12-01 | 2017-01-03 | 
2  | 2017-01-20 | 2017-02-28 | 
3  | 2017-03-15 | 2017-03-16 | 

que je dois N'afficher que les enregistrements dans la table Semaines, qui ont des dates communes avec des plages de dates dans la table Périodes. En d'autres termes, j'ai besoin de supprimer des semaines où l'heure entre StartDate et EndDate n'a aucune date en commun avec aucune des périodes de la table de périodes. Des pensées comment faire ça?

Le tableau de résultat des semaines devrait être:

WeekID | StartDate | EndDate | 
1  | 2017-01-01 | 2017-01-07 | 
3  | 2017-01-15 | 2017-01-21 | 

Toute réflexion sur cela aidera.

+1

quels sont vos dbms? –

+0

Je ne sais pas, je suis en train d'écrire un SP en utilisant les tables '@Weeks' et '@Periods'. –

+0

Quelle base de données utilisez-vous? Oracle, SQL Server, MySQL, Postrgres etc? –

Répondre

1

Cela renverra Weeks qui ne se chevauchent pas Period:

select * 
from Weeks w 
where not exists (
    select 1 
    from Weeks l 
     inner join Periods r 
     on l.EndDate >= r.StartDate 
     and r.EndDate >= l.StartDate 
    where w.WeekId = l.WeekId 
) 

rextester Démo: http://rextester.com/VYTEC19325

retours:

+--------+------------+------------+ 
| WeekId | StartDate | EndDate | 
+--------+------------+------------+ 
|  2 | 2017-01-08 | 2017-01-14 | 
+--------+------------+------------+ 

Pour supprimer les Weeks, le changement select *-delete.

Pour sélectionner simplement Weeks qui chevauchent Periods, remplacez not exists() par exists().

+0

Merci. Je vais essayer ça. –