Mysql
 sql >> база данни >  >> RDS >> Mysql

Нуждаете се от масив от блокове за дати от MySql база данни

Вижте диаграмата по-долу, която представя някои припокриващи се периоди от време

X----|              |--------|         |------X
    |-------X      X------------X
                         |----|     X----|

Началото или края на всеки следващ период от време, отбелязан с X не попада в друг период от време. Ако идентифицираме тези моменти, можем да постигнем известен напредък.

Тази заявка идентифицира границите.

SELECT boundary FROM
(

-- find all the lower bounds
    SELECT d1.StartDate AS boundary, 'lower' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.StartDate > d2.StartDate
        AND 
        d1.StartDate < d2.EndDate
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate

UNION

-- find all the upper bounds
    SELECT d1.EndDate AS boundary, 'upper' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.EndDate > d2.StartDate
        AND 
        d1.EndDate < d2.EndDate 
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate
) as boundaries

ORDER BY boundary ASC

Резултатът от тази заявка за вашите данни е

boundry    | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper

Периодите от време, които търсите, са между последователни долни и горни граници, показани по-горе. С малко последваща обработка те могат лесно да бъдат намерени.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Highchart - Показване на JSON данни - MYSQL / PHP

  2. има ли начин да изброите всички запазени думи в mysql с помощта на помощната програма на командния ред mysql

  3. Каква е разликата между CASE и IF в mysql

  4. валидиране и добавяне на данни към db таблица

  5. Попълнете падащия списък в зависимост от друга селекция от падащо меню с помощта на Ajax