使用SQL检查时间和日期之间的空闲时间

时间:2018-08-04 17:28:38

标签: mysql sql

假设我有一个这样的表:

+----+----------------+------------+------------+-----------+----------+
| 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点之间的空闲时间。

1 个答案:

答案 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列):

http://sqlfiddle.com/#!9/02020d8/8