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

Loại trừ các khoảng thời gian chồng chéo trong chức năng tổng hợp thời gian

Điều này thì sao:

 WITH
   /* get all time points where something changes */
   points AS (
       SELECT "startDate" AS p
       FROM temp_period
       UNION SELECT "endDate"
       FROM temp_period
   ),
   /*
    * Get all date ranges between these time points.
    * The first time range will start with NULL,
    * but that will be excluded in the next CTE anyway.
    */
   inter AS (
      SELECT daterange(
                lag(p) OVER (ORDER BY p),
                p
             ) i
      FROM points
   ),
   /*
    * Get all date ranges that are contained
    * in at least one of the intervals.
    */
   overlap AS (
      SELECT DISTINCT i
      FROM inter
         CROSS JOIN temp_period
      WHERE i <@ daterange("startDate", "endDate")
   )
/* sum the lengths of the date ranges */
SELECT sum(age(upper(i), lower(i)))
FROM overlap;
 

Đối với dữ liệu của bạn, nó sẽ trả về:

┌──────────┐ │ interval │ ├──────────┤ │ 576 days │ └──────────┘ (1 row)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kết nối db heroku từ chối

  2. Chỉ chạy PostgreSQL trong bộ nhớ

  3. Heroku pg:Khôi phục sao lưu không thành công do ứng dụng Rails hết thời gian chờ

  4. SQL trùng lặp các hàng với nhiều phép nối bên trái

  5. Django:Tôi gặp lỗi [quan hệ auth_group không tồn tại] sau khi syncdb