Как получить доступное время для врача на сегодняшних встречах? - PullRequest
5 голосов
/ 01 марта 2012

Я работаю над проектом в компании. Я пытаюсь решить этот запрос, но не смог.

Мои таблицы:

  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
    

    На самом деле есть и другие значения, но я думаю, что их достаточно для решения проблемы.

Я сравниваю назначения пациентов с этой таблицей timeSchedule.

Теперь предположим, что если я передам параметр doctorId как 56 , а рассмотрим сегодня как 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 Ответ

4 голосов
/ 02 марта 2012

Если предположить, что 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.

Форматирование времени возврата также очень просто .См. Таблицу в этой ссылке для всех ваших вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...