假设我有一个这样的表:
+----+----------------+------------+------------+-----------+----------+
| id | time_needed | date_start | date_stop | hour_start| hour_stop |
+----+----------------+------------+------------+-----------+----------+
| 1 | 30 | 2018-08-06 | 2018-08-06 | 08:00:00 | 08:30:00 |
| 2 | 96 | 2018-08-06 | 2018-08-06 | 10:45:00 | 14:21:00 |
| 3 | 20 | NULL | NULL | NULL | NULL |
| 4 | 56 | NULL | NULL | NULL | NULL |
+----+----------------+------------+------------+-----------+----------+
我知道何时执行操作1和2,但是对于3和4,我只知道执行操作所花费的时间(20分钟和56分钟) 我可以执行操作3时如何检查mysql?我的意思是,是否可以检查我何时有空以及有多长时间? 查看表,我可以说我从08:31到10:44有空闲时间,但是有一种方法可以通过mysql检查它吗?
编辑
我希望看到上午8点至晚上18点之间的空闲时间。
答案 0 :(得分:1)
您所要求的不是(单独)mysql的任务。 mysql可以根据您的查询为您提供DATA-但您的编程语言应尽可能增加计划条目的逻辑。
首先,我将从以下数据库更改开始:
date_start + time_needed
因此,您最终得到一个像这样的数据表:
+----+----------------+---------------------+
| id | time_needed | date_start |
+----+----------------+---------------------+
| 1 | 30 | 2018-08-06 08:00:00 |
| 2 | 96 | 2018-08-06 14:21:00 |
+----+----------------+---------------------+
现在,您需要做的就是:将表与自身连接起来,并确保所有内容均按应有的方式进行计算:
-- new Task takes 25 Minutes.
SELECT DISTINCT L.* FROM time_table L LEFT JOIN time_table R
-- compare with every later schedule
on L.date_start < R.date_start
WHERE
-- use only rows that have enough time for the task that should be scheduled
(date_add(L.date_start, INTERVAL L.time_needed + 25 MINUTE ) < R.date_start
-- and only in the future
and date_add(L.date_start, INTERVAL L.time_needed MINUTE) > NOW()
-- due to the join, it might happen that we ignore entries in between.
-- make sure, there is no other task in the calculated timespan!
and not exists
(SELECT id FROM time_table x WHERE
x.date_start > L.date_start AND
x.date_Start < date_add(L.date_start, INTERVAL L.time_needed + 25 MINUTE) )
)
-- and ofc. the last row in the schedule.
OR isnull (R.date_start);
这将返回两个数据行,因为可以在每个其他任务之后安排25分钟。 http://sqlfiddle.com/#!9/02020d8/1
14:21 - 08:00 is 6:21
和30分钟被“预订”。因此差距为5:51-因此350
分钟任务应该紧接08:00
之后-351
分钟任务不适合
350分钟待安排: http://sqlfiddle.com/#!9/02020d8/2
排定的351分钟: http://sqlfiddle.com/#!9/02020d8/3
此后您需要做的所有事情:
取小号ID,并在其后插入时间表。请记住,date_start
将是prior_date_start + prior_time_needed
。
也请参见以下示例:计划20分钟的任务将为示例数据提供3个选项(为方便起见添加了2列):