SQL-Abfrage, um zu prüfen, ob ein timeblock bereits vorhanden ist

Suchte viel und fand viel, Und kam mit einer Abfrage, die funktioniert, aber ist ein wenig langsam.

Was ich überprüfen möchte, ist die folgende Bedingung:

Ich habe einen Tisch mit Terminen mit StartTime und EndTime . Wenn ich einen neuen Termin timerange gibt es derzeit keine Scheck, ob es bereits eine Art Termin in der angegebenen timerange . Zum Beispiel möchte ich einen Termin mit einem timeblock von 09:00 – 09:30 insert, aber es gibt bereits einen Termin von 09:15 – 09:30 dann muss ich diesen bestimmten Termin durch eine Abfrage zurückgeben. Auch überlappende Blöcke und ganze Blöcke müssen zurückgegeben werden. Also muss jeder Termin, der einander berührt, zurückgegeben werden.

Die Abfrage, die ich jetzt habe, ist die folgende:

 SELECT * from dbo.Appointments WHERE (('2017-09-26 09:00:00' > StartTime AND '2017-09-26 09:00:00' < EndTime) OR ('2017-09-26 09:30:00' > StartTime AND '2017-09-26 09:30:00' < EndTime) OR (StartTime BETWEEN '2017-09-26 09:00:00' AND '2017-09-26 09:30:00')) 

Dies wird jeden Termin zurückgeben, der sich überlappt oder im Bereich des neuen Termins, aber es ist irgendwie langsam.

Gibt es eine andere query , um es in einem SELECT zu überprüfen oder ist diese OR OR statement die einzige Lösung?

Sie brauchen definitiv Indizes auf StartTime und EndTime wenn Sie möchten, dass Ihr SQL schnell läuft. Darüber hinaus denke ich, die folgende Abfrage würde tun, was Sie auch brauchen und es ist subtiler

 SELECT * from dbo.Appointments WHERE EndTime > '2017-09-26 09:00:00' AND StartTime < '2017-09-26 09:30:00' 

Verwenden Sie BETWEEN in SQL, während Sie zwei data vergleichen. Verwenden Sie nicht> oder <