Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm phẳng các khoảng thời gian giao nhau

Đây là một giải pháp duy nhất của SQL. Tôi đã sử dụng DATETIME cho các cột. Lưu trữ thời gian riêng biệt theo quan điểm của tôi là một sai lầm, vì bạn sẽ gặp vấn đề khi thời gian quá nửa đêm. Tuy nhiên, bạn có thể điều chỉnh điều này để xử lý tình huống đó nếu cần. Giải pháp cũng giả định rằng thời gian bắt đầu và kết thúc KHÔNG ĐỦ. Một lần nữa, bạn có thể điều chỉnh nếu cần nếu không phải như vậy.

Ý chính chung của giải pháp là có được tất cả thời gian bắt đầu không trùng lặp với bất kỳ nhịp nào khác, nhận tất cả thời gian kết thúc không trùng lặp với bất kỳ nhịp nào, sau đó khớp cả hai với nhau.

Kết quả phù hợp với kết quả mong đợi của bạn ngoại trừ một trường hợp, việc kiểm tra bằng tay có vẻ như bạn mắc lỗi trong kết quả mong đợi của mình. Vào ngày thứ 6, phải có một khoảng thời gian kết thúc tại 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ADO.NET gọi Thủ tục lưu trữ T-SQL gây ra SqlTimeoutException

  2. Azure Data Studio là gì?

  3. TDS Server - Sử dụng các câu lệnh Transact-SQL (T-SQL) để làm việc với dữ liệu Salesforce trong SQL Server

  4. Không thể tìm thấy microsoft.sqlserver.batchparser.dll

  5. Ví dụ về Chuyển đổi ‘smalldatetime’ thành ‘datetime’ trong SQL Server (T-SQL)