我正在公司的一个项目上工作.我试图解决这个问题,但我不能.
我的表是:
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
Run Code Online (Sandbox Code Playgroud)这是我的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
Run Code Online (Sandbox Code Playgroud)
实际上有更多的价值,但我认为这些足以解决问题.
我正在将患者预约与此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
Run Code Online (Sandbox Code Playgroud)
我怎样才能达到上述效果?
假设timeSchedule.startTime和timeSchedule.endTime都是Time数据类型,则将类似于以下内容:(如果不是,则可以这样转换)。
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)
)
)
Run Code Online (Sandbox Code Playgroud)
哪个与您的样本数据一起返回以下内容:
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表定义的任何时隙之前或之后开始。
格式化返回时间也是一件简单的事情。有关所有选项,请参见此链接中的表格。