J'ai une table avec les dates et heures de début et de fin que j'ai besoin de déterminer si un chevauchement et pas tout à fait sûr le meilleur chemin à parcourir. Initialement, je pensais utiliser un curseur imbriqué comme indiqué ci-dessous qui fonctionne, mais je vérifie deux fois les mêmes enregistrements les uns par rapport aux autres et je suis sûr que ce n'est pas très efficace. Par exemple: cette table entraînerait un chevauchement.Comment vérifier les dates ne se chevauchent pas dans une table en utilisant TSQL
id start end
-------------------------------------------------------
1 2009-10-22 10:19:00.000 2009-10-22 11:40:00.000
2 2009-10-22 10:31:00.000 2009-10-22 13:34:00.000
3 2009-10-22 16:31:00.000 2009-10-22 17:34:00.000
Declare @Start datetime, @End datetime, @OtherStart datetime, @OtherEnd datetime, @id int, @endCheck bit
Set @endCheck = 0
DECLARE Cur1 CURSOR FOR
select id, start, end from table1
OPEN Cur1
FETCH NEXT FROM Cur1 INTO @id, @Start, @End
WHILE @@FETCH_STATUS = 0 AND @endCheck = 0
BEGIN
-- Get a cursor on all the other records
DECLARE Cur2 CURSOR FOR
select start, end from table1
and id != @id AND start < @end
OPEN Cur2
FETCH NEXT FROM Cur2 INTO @OtherStart, @OtherEnd
WHILE @@FETCH_STATUS = 0 AND @endCheck = 0
BEGIN
if (@Start > @OtherStart AND @Start < @OtherEnd OR
@End > @OtherStart AND @End < @OtherEnd)
or
(@OtherStart > @Start AND @OtherStart < @End OR
@OtherEnd > @Start AND @OtherEnd < @End)
BEGIN
SET @endCheck = 1
END
FETCH NEXT FROM Cur2 INTO @OtherStart, @OtherEnd
END
CLOSE Cur2
DEALLOCATE Cur2
FETCH NEXT FROM Cur1 INTO @id, @Start, @End
END
CLOSE Cur1
DEALLOCATE Cur1
est là une raison quelconque vous ne mettez pas une clause WHERE votre deuxième curseur pour sélectionner uniquement les enregistrements qui ont un début avant la date de fin de l'enregistrement en cours (par exemple, id!= @id ET start <@end)? – Zachary
non, bon point. – Jon