Это заставляет мою голову болеть! : PВычислить перекрывающиеся длительности в MySQL/PHP
У меня есть таблица assignments
, и я бы хотел рассчитать продолжительность члена на основе их назначений. В упрощенной форме это будет относительно прямолинейно.
-------------------------------------------------------------------------
| id | member_id | unit_id | start_date | end_date |
-------------------------------------------------------------------------
| 1 | 2 | 23 | 2013-01-01 | 2013-02-01 |
-------------------------------------------------------------------------
| 2 | 2 | 25 | 2013-02-01 | 2013-03-01 |
-------------------------------------------------------------------------
| 3 | 2 | 27 | 2013-03-01 | NULL |
-------------------------------------------------------------------------
Это просто вопрос того, чтобы делать SUM()
из DATEDIFF()
на start_date
и end_date
. Проблема заключается в том, что участники могут иметь одновременные задания.
-------------------------------------------------------------------------
| id | member_id | unit_id | start_date | end_date |
-------------------------------------------------------------------------
| 1 | 2 | 23 | 2013-01-01 | 2013-02-01 |
-------------------------------------------------------------------------
| 2 | 2 | 25 | 2013-02-01 | 2013-03-01 |
-------------------------------------------------------------------------
| 3 | 2 | 30 | 2013-02-15 | 2013-03-01 |*
-------------------------------------------------------------------------
| 4 | 2 | 27 | 2013-03-01 | NULL |
-------------------------------------------------------------------------
Теперь я должен как-то понять, что # 3 произошло в то же время, как # 2, так что я не должен добавить его в SUM()
.
Идет дальше, что, если у члена есть пробелы в их продолжительности?
-------------------------------------------------------------------------
| id | member_id | unit_id | start_date | end_date |
-------------------------------------------------------------------------
| 1 | 2 | 23 | 2013-01-01 | 2013-02-01 |
-------------------------------------------------------------------------
| 2 | 2 | 25 | 2013-02-01 | 2013-02-05 |*
-------------------------------------------------------------------------
| 3 | 2 | 30 | 2013-02-15 | 2013-03-01 |*
-------------------------------------------------------------------------
| 4 | 2 | 27 | 2013-03-01 | NULL |
-------------------------------------------------------------------------
Кроме того, NULL
означает "текущий", так что бы CURDATE()
.
Любые идеи?
Может быть проще создавать таблицы в SQLFiddle, как для вас, так и для нас. – skv
Также вы можете дать более четкое представление о ожидаемом результате, выглядит немного неясным, что вы хотите использовать для СУММЫ() – skv
@skv Я ищу # дней "назначенных" –