2010-06-15 9 views
3

Je fais des recherches sur ce problème depuis un certain temps et je n'arrive pas à trouver une solution, j'espère que quelqu'un ici pourra vous aider.Dates qui se croisent

Je travaille actuellement avec la gestion du serveur Microsoft SQL, j'ai essayé de faire ce qui suit:

Auparavant, l'ancienne requête serait tout simplement retourner les résultats qui correspondent entre deux dates Heres la requête précédente:

SELECT e.Name, o.StartDate, o.EndDate 
FROM dbo.Name e, dbo.Date o 
WHERE 
where e.Name = o.Name 
and o.StartDate <= '2010-09-28 23:59:59' 
and o.EndDate >= '2010-9-28 00:00:00' 
and e.Name like 'A' 

table exemple qui est produit après la requête est exécutée (la vraie table a beaucoup plus de lignes évidemment: P):

Name Start     End 
A  2010-09-28 07:00:00  2010-09-28 17:00:00 
A  2010-09-28 13:45:00  2010-09-28 18:00:00 
A  2010-09-28 08:00:00  2010-09-28 16:00:00 
A  2010-09-28 07:00:00  2010-09-28 15:30:00 

Cependant, nous devons changer cela, de sorte que la requête effectue les opérations suivantes:

trouver les dates qui se croisent pour une journée x trouver les dates qui ne se croisent pas un jour x

J'ai trouvé un vrai site utile à ce sujet http://bloggingabout.net/blogs/egiardina/archive/2008/01/30/check-intersection-of-two-date-ranges-in-sql.aspx Cependant la date à comparer contre est entrée, le mien par contre a toutes les dates qui se croisent/ne se croisent pas.

Merci pour l'aide à tous.

Répondre

2

Dates qui se croisent:

SELECT 
    E.name, 
    O.start_date, 
    O.end_date 
FROM 
    dbo.Names E 
INNER JOIN dbo.Dates O ON 
    O.name = E.name AND 
    O.start_date < @end_date AND 
    O.end_date > @start_date 
WHERE 
    E.name LIKE 'A' 

Les dates qui ne se coupent pas est simplement l'inverse par rapport aux dates:

SELECT 
    E.name, 
    O.start_date, 
    O.end_date 
FROM 
    dbo.Names E 
INNER JOIN dbo.Dates O ON 
    O.name = E.name AND 
    (O.start_date > @end_date OR 
    O.end_date < @start_date) 
WHERE 
    E.name LIKE 'A' 

Je ne tenait pas compte des correspondances exactes des dates. Décidez comment vous voulez gérer ceux-ci et ensuite ajuster en conséquence.

+0

Merci beaucoup mate, c'était vraiment utile mais simple – ChickSentMeHighE

2

les opérations suivantes:

SELECT e.Name, o.StartDate, o.EndDate 
FROM dbo.Name e, dbo.Date o 
WHERE 
where e.Name = o.Name 
and o.StartDate <= '2010-09-28 23:59:59' 
and o.EndDate >= '2010-09-28 00:00:00' 
and exists 
(select null from dbo.Date o2 
where o.Name = o2.Name and 
o.StartDate <= o2.EndDate and 
o.EndDate >= o2.StartDate and 
o.ID <> o2.ID) 

pour les dates d'intersection; changer ... et existe ... à ..et n'existe pas ... pour des dates qui ne se croisent pas. (J'ai supposé que dbo.Date a un champ de clé primaire appelé ID - vous voulez éviter que les plages de dates se chevauchent.)

+0

Merci pour la solution alternative! – ChickSentMeHighE

Questions connexes