2012-03-01 25 views
5

Estoy trabajando en un proyecto en una empresa. Estoy tratando de resolver esta consulta, pero no pude.¿Cómo obtener tiempo disponible para el médico de las citas de hoy?

Mis cuadros son:

  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. Ésta es mi timeSchedule tabla:

    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 
    

    En realidad hay más valores, pero creo que estos son suficientes para resolver el problema.

Estoy comparando citas de pacientes con esta tabla timeSchedule.

Supongamos ahora que si paso parámetro doctorId como 56 y considero hoy el 23 de marzo entonces la salida debería ser así:

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 

¿Cómo puedo conseguir el resultado anterior?

+0

Por qué ID 1, cuando no hay ningún paciente para 08:00-09:00? ¿Qué pasa con ese tramo de 10:00 a 10:15, para el cual no hay entrada TimeSchedule? –

+0

Esto es confuso. ¿Cuáles son las reglas (no las muestras de datos) que determinan qué debe mostrar su consulta? –

+0

¿Quisiste decir 1:15 a 2:15 en esa última cita para 57? Cambié ya que parecía coincidir con la serie. Esa es también la información que utilicé a continuación. – RThomas

Respuesta

4

Suponiendo que timeSchedule.startTime y timeSchedule.endTime son ambos tipos de datos de tiempo, entonces sería algo como esto ...: (de lo contrario, podría emitir como tal).

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

que, con sus datos de ejemplo devuelve lo siguiente:

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

En esencia, la consulta dice: dame cualquier cita para este médico donde los nombramientos existentes no comiencen o finalicen entre los marcos de tiempo, o comiencen antes y después de cualquiera de los intervalos de tiempo definidos por el horario mesa.

formato a los tiempos de retorno es también un simple matter. See the table in this link for all your options.

+0

Acabo de agregar una tercera cláusula para tener en cuenta cuando un appt anterior comienza antes y termina después de un intervalo de tiempo determinado. Eso haría que esa ranura no esté disponible también. Entonces, si usa este código, asegúrese de considerar esa opción. – RThomas

+0

Este código también asume que sus aplicaciones no se cruzan de un día al otro ... (es decir, de las 11PM a la 1 AM del día siguiente) – RThomas

+0

debe haber "Y" entre la primera y la segunda condición de tiempo de comparación. – Mayur

Cuestiones relacionadas