Разница между двумя датами и секундами печати каждого дня с помощью mysql и переполнения стека

У меня есть таблица в MySQL с некоторыми данными, как это:

id    from                  to
----  --------------------  ---------------------------
1     2013-01-31 23:50:00   2013-02-02 09:00:00
2     2013-02-05 11:21:12   2013-02-08 01:01:01
3     2013-02-08 17:33:44   2013-02-08 18:22:55
4     2013-02-12 01:40:12   2013-02-12 02:00:59
5     2013-02-28 01:40:12   2013-03-02 02:00:59

Мне нужен запрос Mysql или код php для определения разницы между столбцом «от» и столбцом «до» в каждой строке, а также для определения количества секунд в каждом дне между датами «от» и «до», например, для В строке 1 нужный вывод будет примерно таким:

разница между 2013-01-31 23:50:00 — 2013-02-02 09:00:00 для строки 1

2013-01-31: 600 секунд (24:00:00 — 23:50:00 => 600 секунд)

2013-02-01: 86400 сек (24:00:00 — 00:00:00 => 86400 сек)

2013-02-02: 32400 сек (09:00:00 — 00:00:00 => 32400 сек)

и так далее … для каждого ряда

Команда MySQL является предпочтительной. какой код может создать этот вывод? Есть ли какая-либо конкретная функция в PHP или MySQL для создания этого вывода?

Я читаю эти ответы:
mysql рассчитывает секунды между двумя датой / временем для каждого дня

MySQL: как получить разницу между двумя временными метками в секундах

но это не мой ответ.

для информации:
ссылка 1 — это вопрос, похожий на мой вопрос, но ответ неверен, потому что «Команду нужно сгруппировать по дням», но как ?!
и второй не мой вопрос, а первый вопрос, помеченный как дублированный со ссылкой 2, и это не так.

0

Решение

Позвольте мне предположить, что у вас есть таблица дат. Если это так, вы можете использовать join или коррелированный подзапрос:

select d.date,
(select sum(timestampdiff(second,
greatest(d.date, t.from),
least(d.date, t.to)
))
from table t
where t.to >= d.date and
t.from < date_add(d.date, interval 1 day)
) as NumSeconds
from dates d;

Если у вас нет dates какая-то таблица, вы можете создать ее на лету:

from (select date('2013-01-31') as date union all
select date('2013-02-01') union all
. . .
) dates
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]