Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Meratakan rentang waktu yang berpotongan

Berikut ini adalah satu-satunya solusi SQL. Saya menggunakan DATETIME untuk kolom. Menyimpan waktu secara terpisah adalah kesalahan menurut saya, karena Anda akan mengalami masalah ketika waktu melewati tengah malam. Anda dapat menyesuaikan ini untuk menangani situasi itu jika perlu. Solusinya juga mengasumsikan bahwa waktu mulai dan berakhir BUKAN NULL. Sekali lagi, Anda dapat menyesuaikan sesuai kebutuhan jika bukan itu masalahnya.

Inti umum dari solusinya adalah untuk mendapatkan semua waktu mulai yang tidak tumpang tindih dengan rentang lainnya, dapatkan semua waktu akhir yang tidak tumpang tindih dengan rentang mana pun, lalu cocokkan keduanya.

Hasilnya sesuai dengan hasil yang Anda harapkan kecuali dalam satu kasus, yang memeriksa dengan tangan sepertinya Anda memiliki kesalahan dalam hasil yang Anda harapkan. Pada tanggal 6 seharusnya ada rentang waktu yang berakhir pada 06-06-2009 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menonaktifkan Semua Batasan PERIKSA &Kunci Asing dalam Database di SQL Server (Contoh T-SQL)

  2. Bagaimana cara membersihkan (mencegah injeksi SQL) SQL dinamis di SQL Server?

  3. Mengapa &Kapan saya harus menggunakan SPARSE COLUMN? (SQLSERVER 2008)

  4. Perbedaan antara numerik, float dan desimal di SQL Server

  5. Bagaimana Menghubungkan Python ke SQL Server untuk Mengotomatiskan Proses Backend