在我的应用程序中,我有一个用户订购的约会,该表如下所示:

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


*注意:开始时间为每天09:00 AM

现在我想通过simID获取特定日期(例如2016-09-01)的所有空闲时间

这意味着结果需要在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)。

解决该问题的任何其他方法将不胜感激!

我正在考虑使用以下方法创建temp 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


但我被困住了

最佳答案

这是我的答案。

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


仅当day和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


如果可能,请告诉我,我会再试一次。

关于mysql - mysql在单个表中的行之间返回TIMEDIFF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40290918/

10-11 01:10