首页 > 解决方案 > mysql检查两列之间的预订重叠时间

问题描述

我有一个表预订,其中有两列 job_time_beg 和 job_time_end,工作从 8:00 开始,一直到 16:00 现在我需要如果可用时间与给定时间重叠,这样我就知道我不想在给定时间内预订时间。

我在用

      select count(*)as cnt from orders
      where job_date = '2021-02-04'
      and job_truck  = '24'
      and ((job_time_beg >= '10:00' and job_time_beg < '12:00')
           or (job_time_end > '(11):00' and job_time_end <= '12:00'))
        AND order_status_id in (1,5)

这适用于大多数情况,但如果在 8:00 和 11:00 之间有预订,则此查询不起作用并显示 10:00 到 12:00 的时间可用,在 8:00 和 11:00 之间重叠我也试过

SELECT count(*) as cnt
FROM orders
 WHERE
 job_date = '$data'
      and job_truck  = '$truck' and
(
   '$start' BETWEEN job_time_beg and job_time_end 
   OR
   '$end' BETWEEN job_time_beg and job_time_end
)
        AND order_status_id in (1,5)

这适用于 8:00 和 11:00 重叠,但当预订可用于前开始时间时不起作用如果我们有 8:00 到 10:00 的预订并且我们有时间,则可以等于下一次预订的结束时间10:00 到 12:00 这不重叠,因为我们可以从 10:00 开始分配下一个预订。

请看一下 sql fiddle sqlfiddle

标签: phpmysqlsqloverlap

解决方案


两个时间段重叠的逻辑是:

  • 第一个在第二个结束之前开始。
  • 第一个在第二个开始之后结束。

在您的查询中,逻辑是:

SELECT count(*) as cnt
FROM orders
WHERE job_date = @job_date AND
      job_truck  = @truck AND
      @start < job_time_end AND
      @end > job_time_begin AND
      order_status_id IN (1, 5);

注意命名参数的使用。 不要使用参数值来处理查询字符串!. 参数可防止意外和难以调试的语法错误。它们还保护代码免受 SQL 注入攻击。


推荐阅读