I am trying to write an SQL Query that looks for any time slots in the table.
My table has the following appointments slots reserved for a specific day – say 01/11/2020.
StartTime EndTime 09:55 10:55 15:00 16:00 14:00 15:00 13:00 13:30 12:15 16:00 12:00 16:00
My SQL Query is as follows:
SELECT * FROM dbo.Appointment WHERE AppointmentDate = '01/11/2020' AND IsActive = 'True' AND (CAST(StartTime AS TIME) BETWEEN CAST('10:00' AS TIME) AND CAST('11:55' AS TIME) AND CAST(EndTime AS TIME) BETWEEN CAST('10:00' AS TIME) AND CAST('11:55' AS TIME))
The problem is that the query is returning zero rows. Infact, it should return me the row 09:55 and 10:55
as this record falls in the time range that I have provided: 10:00 - 11:55
Can anyone help me to figure out the issue please?
Advertisement
Answer
A slot does not overlap with another if it ends before the other starts, or it starts after the other ends.
where '11:55' < StartTime or EndTime < '10:00'
To find overlapping slots, invert the rule. It ends after the other starts and it starts before the other ends.
where StartTime < '11:55' and '10:00' < EndTime
There’s no need to cast the values, MySQL will do it for you, assuming StartTime and EndTime are time
columns.