sql >> データベース >  >> RDS >> Sqlserver

交差するタイムスパンの平坦化

    これがSQLのみのソリューションです。列にDATETIMEを使用しました。時間が真夜中を過ぎると問題が発生するので、時間を別々に保存することは私の意見では間違いです。必要に応じて、この状況を処理するように調整できます。このソリューションは、開始時刻と終了時刻がNULLではないことも前提としています。繰り返しますが、そうでない場合は、必要に応じて調整できます。

    ソリューションの一般的な要点は、他のスパンと重複しないすべての開始時刻を取得し、どのスパンとも重複しないすべての終了時刻を取得してから、2つを一致させることです。

    結果は期待される結果と一致しますが、1つのケースを除いて、手動でチェックすると、期待される出力に誤りがあるように見えます。 6日には、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. node-1つのクエリでのmysqlの複数のステートメント

    2. SQLServer2008で通知を変更する

    3. SQLiteの日付と時刻

    4. MySQLオフセット無限行