Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Sélection de toutes les dates d'un tableau dans une plage de dates et incluant 1 ligne par date vide

Il existe plusieurs façons de traiter les lignes manquantes, mais toutes consistent à avoir un autre ensemble de données à combiner avec vos résultats actuels.

Cela pourrait être dérivé de vos résultats, créés par un CTE ou un autre processus (comme votre exemple), ou (ma préférence) en utilisant un modèle permanent rejoindre contre.

Le modèle dans votre cas pourrait simplement être un tableau de dates, comme votre @datesTBL. La différence étant qu'il est créé à l'avance avec, par exemple, 100 ans de dates.

Votre requête peut alors être similaire à votre exemple, mais j'essaierais ce qui suit...

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

Cela place le modèle de calendrier sur la GAUCHE, et facilite ainsi de nombreuses requêtes car vous savez que le champ de date du calendrier est toujours rempli, est toujours une valeur de date uniquement (pas de partie horaire), est dans l'ordre, est simple à GROUPER PAR, etc.