Нужен массив блоков даты из базы данных MySql - PullRequest
3 голосов
/ 16 ноября 2011

Хорошо, у меня есть таблица базы данных строк с StartDate и EndDate. Что мне нужно сделать, это вернуть блоки израсходованного времени из этого.

Так, например, если у меня есть 3 строки следующим образом:

RowID  StartDate   EndDate
1      2011-01-01  2011-02-01
2      2011-01-30  2011-02-20
3      2011-03-01  2011-04-01

тогда блоки использованного времени будут выглядеть следующим образом:

2011-01-01 до 2011-02-20 и 2011-03-01 до 2011-04-01

Есть ли простой способ извлечь это из базы данных MySql? Любые предложения приветствуются!

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

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

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

Диапазон дат, после которого вы находитесь, находится между последовательными нижними и верхними границами, показанными сверху. С небольшой постобработкой их легко найти.

0 голосов
/ 16 ноября 2011

Пробовали ли вы mysql group concat

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

Она вернет строку, разделенную запятыми, но вам все равно придется инициализировать ее как массив в вашем приложении.

...