2016-10-27 3 views
1

в мое приложение НМА имеют назначения, что пользователи заказов, и таблица выглядит следующим образом:MySQL обратный TimeDiff между рядами в одной таблице

id simTypeID simID simDateTime   startHour endHour 
1 100  1  2016-09-01 09:00:00 09:00:00 10:00:00 
2 100  2  2016-09-01 10:00:00 10:00:00 11:00:00 
3 100  3  2016-09-01 11:00:00 11:00:00 12:00:00 
4 100  1  2016-10-11 10:00:00 10:00:00 11:00:00 

* Примечание: время пуска 9:00 утра каждый день

теперь я хочу, чтобы все свободное время в конкретной даты (например, 2016-09-01) по simID

это означает, что результат должен быть в tbl_free_time:

simID startFreeHour endFreeHour 
1  10:00:00  23:59:00 
2  09:00:00  09:59:00 
2  11:00:00  23:59:00 
3  09:00:00  10:59:00 
3  12:00:00  23:59:00 

Как я могу использовать TIMEDIFF в одной таблице? (нужно взять endHour первой строки и startHour второй строки).

любой другой способ решить эту проблему будет оценен!

я думал, чтобы создать временный TBL с:

CREATE TABLE tbl_sim_temp LIKE tbl_sim 

INSERT tbl_sim_temp 
SELECT * FROM tbl_sim 
WHERE simDateTime BETWEEN '2016-09-01 00:00:00' AND '2016-09-01 23:59:59' 
ORDER BY id ASC 

и чем использовать LEFT JOIN, что-то вроде что-

SELECT TIMEDIFF(a.startHour,b.endHour) 
FROM a tbl_sim 
LEFT JOIN b tbl_sim_temp 
WHERE a.simID = b.simID AND a.simTypeid = b.simtypeid AND a.id = b.id+1 

, но я застрял

ответ

0

Здесь это мой ответ.

SELECT simID, startFreeHour, endFreeHour 
FROM (
    SELECT simID, "09:00:00" as startFreeHour, SUBTIME(startHour, '00:01:00') as endFreeHour 
    FROM tbl_sim 
    WHERE 
     startHour > "09:00:00" 
     AND DATE(simDateTime) = "2016-09-01" 

    UNION 

    SELECT simID, endHour as startFreeHour, "23:59:00" as endFreeHour 
    FROM tbl_sim 
    WHERE 
     endHour < "23:59:00" 
     AND DATE(simDateTime) = "2016-09-01" 
) as t1 
ORDER BY simID ASC, startFreeHour ASC 

Он работает только тогда, когда есть только одна строка за день и simId и предполагая, что секунд всегда будет равна нулю, чтобы ограничить 23:59:00. Таким образом, этот сценарий не будет работать:

id simTypeID simID simDateTime   startHour endHour 
1 100  1  2016-09-01 09:00:00 10:00:00 11:00:00 
1 100  1  2016-09-01 09:00:00 12:00:00 13:00:00 

Если этот сценарий возможен, просто скажите мне, и я попробую его снова.

+1

благодарим за решение! – ic205

+0

Я не понимаю, вы можете иметь в тот же день две строки с тем же simId? –

+1

есть. каждый simID работает с 09:00 до 23:59 - так что у меня может быть много строк с одним и тем же simID в каждый день. но ваше решение отлично работает – ic205

Смежные вопросы