sql >> Base de Datos >  >> RDS >> Sqlserver

Seleccionar todas las fechas de una tabla dentro de un rango de fechas e incluir 1 fila por fecha vacía

Hay varias formas de lidiar con las filas que faltan, pero todas se tratan de tener otro conjunto de datos para combinar con los resultados actuales.

Eso podría derivarse de sus resultados, creados por un CTE u otro proceso (como su ejemplo), o (mi preferencia) mediante el uso de una plantilla permanente unirse en contra.

La plantilla en su caso podría ser simplemente una tabla de fechas, como su @datesTBL. La diferencia es que se crea por adelantado con, por ejemplo, 100 años de fechas.

Su consulta puede ser similar a su ejemplo, pero intentaría lo siguiente...

SELECT 
    dt.tempDate ,
    InstructorID,           EventStart, 
    EventEnd,               cancelled, 
    cancelledInstructor, 
    EventType,              DevName, 
    Room,                   SimLocation, 
    ClassLocation,          Event, 
    Duration,               TrainingDesc, 
    Crew,                   Notes, 
    LastAmended,            InstLastAmended, 
    ChangeAcknowledged,     Type, 
    OtherType,              OtherTypeDesc, 
    CourseType 
FROM 
  @datesTBL dt 
LEFT OUTER JOIN
  OpsInstructorEventsView iv
    ON  iv.EventStart >= dt.tempDate
    AND iv.EventStart <  dt.tempDate + 1
    AND iv.InstructorID = @InstructorID 
WHERE
      dt.tempDate >= @StartDate
  AND dt.tempDate <= @EndDate
ORDER BY
  dt.tempDate,
  iv.EventStart

Esto pone la plantilla de calendario a la IZQUIERDA, lo que facilita muchas consultas, ya que sabe que el campo de fecha del calendario siempre está lleno, siempre es un valor de fecha solamente (sin parte de tiempo), está en orden, es fácil de AGRUPAR POR, etc.