2012-03-01 2 views
5

저는 회사의 프로젝트를 진행하고 있습니다. 이 쿼리를 해결하려고하지만 할 수 없습니다. 이것은 내 timeSchedule 테이블오늘 약속에서 의사에게 가능한 시간을 얻는 방법?

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 
  • 입니다 :

    1. Appointments :

      내 테이블은

      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 테이블과 환자의 약속을 비교하고있다.

    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 
    

    가 어떻게 위의 결과를 얻을 수 있습니다 : 나는 56 및 매개 변수 doctorId을 통과 오늘 다음 출력은 다음과 같이해야한다 3월 23일입니다 고려하는 경우

    지금 생각?

  • +0

    왜 ID 1, 9시에서 8시까지에 대한 환자가 없을 때? TimeSchedule 항목이없는 10:00에서 10:15까지의 스트레치는 어떻게됩니까? –

    +0

    이것은 혼란 스럽습니다. 쿼리에서 표시 할 내용을 결정하는 규칙 (데이터 샘플 아님)은 무엇입니까? –

    +0

    57에 대한 마지막 appt에서 1:15에서 2:15를 의미합니까? 나는 그 시리즈와 일치하는 것으로 변했다. 아래에서 사용한 데이터이기도합니다. – RThomas

    답변

    4

    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) 
           ) 
           ) 
    

    :

    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.

    +0

    방금 ​​전에 appt가 시작되고 주어진 시간 슬롯 다음에 끝날 때를 고려하여 세 번째 절을 추가했습니다. 그 슬롯은 사용할 수 없게됩니다. 따라서이 코드를 사용하는 경우 해당 옵션을 확인하고 고려하십시오. – RThomas

    +0

    이 코드에서는 앱이 언젠가 다음 날로 넘어 가지 않는다고 가정합니다 (즉, 오후 11 시부 터 다음 날 오전 1 시까 지) – RThomas

    +0

    비교 시간의 첫 번째와 두 번째 조건 사이에 "AND"가 있어야합니다. – Mayur

    관련 문제