如何从今天的约会中获得医生的时间?

May*_*yur 5 sql-server-2008

我正在公司的一个项目上工作.我试图解决这个问题,但我不能.

我的表是:

  1. 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)
  2. 这是我的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)

我怎样才能达到上述效果?

RTh*_*mas 5

假设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表定义的任何时隙之前或之后开始。

格式化返回时间也是一件简单的事情。有关所有选项,请参见此链接中的表格。