sql >> Databasteknik >  >> RDS >> Sqlserver

Välja alla datum från en tabell inom ett datumintervall och inklusive 1 rad per tomt datum

Det finns flera sätt att hantera saknade rader, men alla handlar om att ha en annan uppsättning data att kombinera med dina nuvarande resultat.

Det kan härledas från dina resultat, skapade av en CTE eller annan process (som ditt exempel), eller (min preferens) genom att använda en permanent mall att gå med mot.

Mallen i ditt fall kan bara vara en tabell över datum, som din @datesTBL. Skillnaden är att den är skapad i förväg med till exempel 100 års datum.

Din fråga kan då likna ditt exempel, men jag skulle försöka med följande...

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

Detta sätter kalendermallen till VÄNSTER, och så gör det många frågor enklare eftersom du vet att kalenderns datumfält alltid är ifyllt, är alltid ett endast datumvärde (ingen tidsdel), är i ordning, är enkelt att GRUPPA EFTER, etc.



  1. Hitta referensenheter i SQL Server:sys.dm_sql_referencing_entities()

  2. SharePoint 2010 - Ändring från Kerberos till anspråksbaserad autentisering

  3. Bygg dynamisk meny med kapslade uppsättningar

  4. Extrahera specifika fält från textfil