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

Tính tổng phạm vi ngày mà không tính chồng chéo trong mysql

Đây là bất cứ điều gì bận rộn nhưng sẽ giúp bạn có được những gì bạn cần:

SELECT SUM(PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM a.end_date), EXTRACT(YEAR_MONTH FROM a.start_date))) months
  FROM (
    SELECT MIN(g.start_date) start_date, MAX(g.end_date) end_date 
      FROM (
        SELECT @group_id := @group_id + (@end_date IS NULL OR o.start_date > @end_date) group_id,
               start_date,
               @end_date := DATE(CASE 
                 WHEN (@end_date IS NULL OR o.start_date > @end_date) THEN o.end_date
                 ELSE GREATEST(o.end_date, @end_date)
               END) end_date  
          FROM overlap o
          JOIN (SELECT @group_id := 0, @end_date := NULL) init
      ORDER BY o.start_date ASC  
            ) g
  GROUP BY  g.group_id  
        ) a

Các truy vấn nội bộ nhất nhóm các khoảng thời gian của bạn lại với nhau thành các nhóm chồng chéo kéo dài ngày end_date nếu thích hợp. End_date linh hoạt khi tôi giả định rằng có thể có các khoảng thời gian hoàn toàn nằm trong khoảng thời gian trước đó.

Truy vấn gói tiếp theo trích xuất toàn bộ phạm vi từ mỗi nhóm.

Truy vấn bên ngoài tính tổng các tháng khác nhau cho mỗi nhóm. Tất cả sự khác biệt của nhóm được làm tròn xuống thành đầy tháng gần nhất theo PERIOD_DIFF.

Rất tiếc, tôi không thể kiểm tra điều này vì SQLFiddle đã chết đối với tôi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chi phí lập chỉ mục nhiều cột db là bao nhiêu?

  2. hàm php không trả về tất cả kết quả từ truy vấn MySQL trong foreach

  3. MySQL foreach thay thế cho thủ tục

  4. Có thể có truy vấn PHP MYSQL bỏ qua biến trống trong mệnh đề WHERE không?

  5. Laravel Eloquent nhóm theo kỷ lục gần đây nhất