sql >> Databasteknik >  >> RDS >> Sqlserver

Platta ut korsande tidsperioder

Här är en SQL-lösning. Jag använde DATETIME för kolumnerna. Att lagra tiden separat är enligt mig ett misstag, då du kommer få problem när tiderna går över midnatt. Du kan dock justera detta för att hantera den situationen om du behöver. Lösningen förutsätter också att start- och sluttiderna INTE är NULL. Återigen, du kan justera efter behov om så inte är fallet.

Den allmänna kärnan i lösningen är att få alla starttider som inte överlappar med några andra intervall, få alla sluttider som inte överlappar några intervall och sedan matcha de två tillsammans.

Resultaten matchar dina förväntade resultat förutom i ett fall, där handkontroll ser ut som om du har ett misstag i din förväntade produktion. Den 6:e bör det finnas ett span som slutar 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. Hur man hittar en databas ANSI_NULLS-inställning i SQL Server (T-SQL)

  2. MySQL SELECT endast inte null-värden

  3. Hur man ställer in varje objekt som hämtas från SQLite-databasen till en egen textvy

  4. Inbäddade PostgreSQL för Java JUnit-tester