Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Sumowanie zakresu dat bez zliczania nakładania się w mysql

To jest gorączkowe jak wszystko, ale powinno zapewnić ci to, czego potrzebujesz:

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

Najbardziej wewnętrzne zapytanie grupuje okresy w nakładające się grupy, w razie potrzeby rozciągając datę_końcową. Data_końcowa wygina się, ponieważ założyłem, że mogą istnieć okresy całkowicie objęte poprzednią.

Następne zapytanie opakowujące wyodrębnia pełny zakres z każdej grupy.

Zewnętrzne zapytanie sumuje pełne różnice miesięczne dla każdej grupy. Wszystkie różnice grupowe są zaokrąglane w dół do najbliższego pełnego miesiąca o PERIOD_DIFF.

Niestety nie mogłem tego przetestować, ponieważ SQLFiddle na mnie umarł.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak oddzielić DATE i TIME od DATETIME w MySQL?

  2. Połącz się ze zdalną bazą danych MySQL z kontenera docker

  3. Korzystanie z przygotowanych instrukcji za pomocą mysql w pythonie

  4. RZUT DZIESIĘTNY do INT

  5. Jak MySQL przechowuje wyliczenia?