MySql查询查找时间范围之间的记录

时间:2017-04-30 10:28:07

标签: mysql sql

我正在开展fromto时间的项目,我必须查明是否在该时间段内分配了任何其他车辆。

对于EG: 车辆1在案例表中分配FROM 2017-04-29 10:00:00 TO 2017-04-29 12:00:00

我的使用案例:我不能在该时间范围内分配相同的车辆。

那么,我如何检查车辆是否被分配/与时间范围发生冲突? (在mySQL中)

这是我到目前为止的地方:

 SELECT 'vehicle_code' 
 FROM   'case' 
 WHERE  'from_time' <= '2017-04-29 11:00:00'
 AND    'to_time' >= '2017-04-29 13:00:00'

2 个答案:

答案 0 :(得分:1)

我猜您尝试分配%VEHICLE_CODE%的特定车辆无法在该时间范围内分配,因此您对任何车辆都不感兴趣,但在特定车辆中。< / p>

如果至少出现以下三种情况,则会出现重叠:

  1. 分配的from_time属于您要求的期限
  2. 分配的to_time属于您要求的期限
  3. 整个分配属于您要求的期限
  4. 然后您可以使用此查询

    SELECT count(*) 
    FROM `case`  
    WHERE vehicle_code = %VEHICLE_CODE% 
    AND (from_time between '2017-04-29 11:00:00' AND '2017-04-29 13:00:00'
    OR to_time BETWEEN '2017-04-29 11:00:00' AND '2017-04-29 13:00:00'
    OR from_time < '2017-04-29 11:00:00' AND to_time > '2017-04-29 13:00:00');
    

    使用此查询,您确保车辆没有任何分配 from_time to_time 进入查询期间或整个时期都是如此。

    如果查询返回0,则会有重叠。如果返回的值超过0,则确实存在重叠。

    与@dnoeth告诉您的相似,您还可以排除所有条目,其中to_time小于查询间隔的开始 from_time更大比查询间隔结束。如果仍有任何条目,则这是重叠。所以你会有

    SELECT count(*) 
    FROM `case`  
    WHERE vehicle_code = %VEHICLE_CODE% 
    AND NOT (from_time > '2017-04-29 13:00:00'
    OR to_time < '2017-04-29 11:00:00');
    

答案 1 :(得分:0)

您需要检查这些时间中的任何一个是否属于任何其他车辆的时间范围,例如:

SELECT vehicle_code
FROM `case`
WHERE from_time >= '2017-04-29 11:00:00' AND to_time <= '2017-04-29 11:00:00'

UNION

SELECT vehicle_code
FROM `case`
WHERE from_time >= '2017-04-29 13:00:00' AND to_time <= '2017-04-29 13:00:00'

如果此查询返回任何行,则表示已预订了另一辆车,因此您需要显示相应的错误消息。