sql >> Databasteknik >  >> RDS >> Mysql

Summering av datumintervall utan att räkna överlappningar i mysql

Det här är hur hektiskt som helst men borde ge dig det du behöver:

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

Den innersta frågan grupperar dina perioder i överlappande grupper och sträcker ut slutdatumet där så är lämpligt. Slutdatumet flexar eftersom jag antog att det kunde finnas perioder helt inneslutna av det föregående.

Nästa radbrytningsfråga extraherar hela intervallet från varje grupp.

Den yttre frågan summerar hela månadsskillnaderna för varje grupp. Alla gruppdifferenser avrundas nedåt till närmaste hela månad med PERIOD_DIFF.

Tyvärr kunde jag inte testa detta eftersom SQLFiddle har dött på mig.



  1. Hur beräknar man förhållandet med sql-fråga?

  2. är det bra att använda mysql_free_result($result)?

  3. Lära 2:Kan inte välja entitet genom identifieringsvariabler utan att välja minst ett rotentitetsalias

  4. Hur LTRIM()-funktionen fungerar i MySQL