sql >> Databáze >  >> RDS >> Sqlserver

Zploštění protínajících se časových úseků

Zde je řešení pouze SQL. Pro sloupce jsem použil DATETIME. Oddělené ukládání času je podle mého názoru chyba, protože budete mít problémy, když časy překročí půlnoc. Pokud potřebujete, můžete to upravit, abyste tuto situaci zvládli. Řešení také předpokládá, že časy začátku a konce NEJSOU NULL. Opět můžete upravit podle potřeby, pokud tomu tak není.

Obecnou podstatou řešení je získat všechny počáteční časy, které se nepřekrývají s žádnými jinými rozpětími, získat všechny koncové časy, které se nepřekrývají s žádnými rozpětími, a poté je spojit dohromady.

Výsledky odpovídají vašim očekávaným výsledkům s výjimkou jednoho případu, kdy ruční kontrola vypadá, že máte chybu v očekávaném výstupu. 6. dne by mělo být období, které končí 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. Musím se chránit před vkládáním SQL, pokud jsem použil rozevírací seznam?

  2. Spouštěč aktualizace SQL pouze při změně sloupce

  3. Psql se nemohl připojit k serveru:Žádný takový soubor nebo adresář, chyba 5432?

  4. Úvod do speciálních dotazů