webForumDet fria alternativet

Kolla om ett tidsspann finns inom ett antal andra tidsspann?

Databaser & SQL

2 svar · 485 visningar · startad av inspiro

Medlem sedan sep. 2005673 inlägg
Frågan#1

Hej! Jag har två listor som innehåller tider, en start- och en sluttid. För varje tidspann i den första listan vill jag kolla om den tiden överlappar helt eller delvis någon tid i den andra listan. Har fastnat...

Lista 1:

Starttid | Sluttid
2010-01-01 10:00 | 2010-01-01 12:00
2010-01-01 13:00 | 2010-01-01 17:00

Lista 2:

Starttid | Sluttid
2010-01-01 09:00 | 2010-01-01 10:00
2010-01-01 10:00 | 2010-01-01 11:00
2010-01-01 11:00 | 2010-01-01 12:00

I ovanstående exempel vill jag alltså få fram att den första tiden i lista 1 är upptagen men inte den andra tiden. Som svar skulle 0 eller 1 funka perfekt!

Medlem sedan nov. 20014 054 inlägg
#2

Med BETWEEN kan du kontrollera om ett datum+tid är inom lista 2 starttid och sluttid.

[Lista 1].Starttid BETWEEN [lista 2].Starttid and [lista 2].Sluttid
[Lista 1].Sluttid BETWEEN [lista 2].Starttid and [lista 2].Sluttid

Du kan säkerligen med någon CASE-sats i sql returnera 0 eller 1 beroende på om en subfråga är null eller inte.

case
        when exists (select * from T2 where (T2.a BETWEEN T1.a AND T1.b AND T2.b BETWEEN T1.a AND T1.b)) then
             1
        else
            0
end
from t1

Nu är inte ovanstående exempel genomtänkt.. men åt det hållet..

Medlem sedan sep. 2005673 inlägg
#3

Tack för svar! Fick dock inte kläm på ditt exempel riktigt men jag fick tag på följande kodsnutt som gjorde det jag önskade:

SELECT		l1.StartDate,
		l1.EndDate,
		COALESCE(e.found, 0) AS RangeExists
FROM		@List1 AS l1
OUTER APPLY	(
			SELECT TOP(1)	1
			FROM		@List2 AS l2
			WHERE		l2.StartDate <= l1.EndDate
					AND l2.EndDate >= l1.StartDate
		) AS e(found)
257 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)