我正在公司的一个项目上工作。我试图解决这个问题,但我不能。
我的表是:
Appointments
:
doctorId patientId patientName fromDateTime toDateTime
-------- --------- ----------- --------------------- ---------------------
56 1 fghfgh 3/23/2012 12:15:00 PM 3/23/2012 01:15:00 PM
56 2 asdadf 3/23/2012 01:15:00 PM 3/23/2012 02:15:00 PM
56 3 werwr 3/23/2012 09:15:00 AM 3/23/2012 10:15:00 AM
57 4 uiyui 3/23/2012 09:15:00 AM 3/23/2012 10:15:00 AM
57 5 asdad 3/23/2012 01:15:00 PM 3/23/2012 02:15:00 PM
这是我的timeSchedule
表:
id startTime endTime
-- ------------ ------------
1 08:00:00.000 09:00:00.000
2 09:00:00.000 10:00:00.000
3 11:00:00.000 12:00:00.000
4 12:00:00.000 13:00:00.000
5 13:00:00.000 14:00:00.000
6 14:00:00.000 15:00:00.000
7 15:00:00.000 16:00:00.000
实际上有更多的值,但我认为这些足以解决问题。
我正在将患者预约与此timeSchedule
表进行比较。
现在假设我将参数doctorId
传递为56 而认为今天是3月23日,那么输出应该是这样的:
id startTime endTime
-- --------- --------
1 08:00 AM 09:00 AM
3 11:00 AM 12:00 PM
6 02:00 PM 03:00 PM
7 03:00 PM 04:00 PM
如何达到上述效果?
答案 0 :(得分:4)
假设timeSchedule.startTime和timeSchedule.endTime都是时间数据类型,那么它将是这样的...... :(如果没有,你可以这样投射)。
DECLARE @pDoctorID Int = 56
DECLARE @pDate Date = '3/23/2012'
SELECT * FROM timeSchedule WHERE
NOT Exists (
SELECT doctorid FROM Appointments
WHERE doctorid = @pDoctorID AND
CAST(fromDatetime as Date) = @pDate AND
(
(CAST(fromDatetime as Time) >= timeSchedule.startTime AND
CAST(fromDatetime as Time) <= timeSchedule.endTime)
OR
(CAST(toDatetime as Time) >= timeSchedule.startTime AND
CAST(toDatetime as Time) <= timeSchedule.endTime)
OR
(CAST(toDatetime as Time) <= timeSchedule.startTime AND
CAST(fromDatetime as Time) >= timeSchedule.endTime)
)
)
您的样本数据将返回以下内容:
1 | 08:00:00.00 | 09:00:00.00
4 | 11:00:00.00 | 12:00:00.00
8 | 15:00:00.00 | 16:00:00.00
本质上,查询是说给我这个医生的任命,其中现有的任命不在时间框架之间开始或结束,或者在timeSchedule表定义的任何时间段之前和之后开始。
格式化返回时间也是simple matter. See the table in this link for all your options.