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

时间:2012-03-01 19:11:28

标签: 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
    
  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
    

    实际上有更多的值,但我认为这些足以解决问题。

  3. 我正在将患者预约与此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
    

    如何达到上述效果?

1 个答案:

答案 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.