sql >> Database >  >> RDS >> Sqlserver

Kruisende tijdspannes afvlakken

Hier is een SQL-only oplossing. Ik gebruikte DATETIME voor de kolommen. Het apart opslaan van de tijd is naar mijn mening een vergissing, omdat je problemen krijgt als de tijden voorbij middernacht gaan. U kunt dit echter aanpassen om met die situatie om te gaan als dat nodig is. De oplossing gaat er ook van uit dat de start- en eindtijden NIET NULL zijn. Nogmaals, u kunt indien nodig aanpassen als dat niet het geval is.

De algemene kern van de oplossing is om alle starttijden te krijgen die niet overlappen met andere overspanningen, alle eindtijden te krijgen die niet overlappen met enige overspanningen, en dan de twee bij elkaar te passen.

De resultaten komen overeen met uw verwachte resultaten, behalve in één geval, waarbij handmatige controle eruitziet alsof u een fout heeft in uw verwachte uitvoer. Op de 6e zou er een periode moeten zijn die eindigt op 2009-06-06 10:18:45.000.

SELECT
     ST.start_time,
     ET.end_time
FROM
(
     SELECT
          T1.start_time
     FROM
          dbo.Test_Time_Spans T1
     LEFT OUTER JOIN dbo.Test_Time_Spans T2 ON
          T2.start_time < T1.start_time AND
          T2.end_time >= T1.start_time
     WHERE
          T2.start_time IS NULL
) AS ST
INNER JOIN
(
     SELECT
          T3.end_time
     FROM
          dbo.Test_Time_Spans T3
     LEFT OUTER JOIN dbo.Test_Time_Spans T4 ON
          T4.end_time > T3.end_time AND
          T4.start_time <= T3.end_time
     WHERE
          T4.start_time IS NULL
) AS ET ON
     ET.end_time > ST.start_time
LEFT OUTER JOIN
(
     SELECT
          T5.end_time
     FROM
          dbo.Test_Time_Spans T5
     LEFT OUTER JOIN dbo.Test_Time_Spans T6 ON
          T6.end_time > T5.end_time AND
          T6.start_time <= T5.end_time
     WHERE
          T6.start_time IS NULL
) AS ET2 ON
     ET2.end_time > ST.start_time AND
     ET2.end_time < ET.end_time
WHERE
     ET2.end_time IS NULL


  1. Wat is Azure Data Studio?

  2. Kom naar Amsterdam voor een Meetup met OptimaData &VidaXL

  3. MySQL INT betekenis

  4. SQL rekenkundige operatoren