【问题标题】:mysql check booking overlap time between two columnsmysql检查两列之间的预订重叠时间
【发布时间】:2021-02-03 06:48:54
【问题描述】:

我有一个表预订,其中有两列 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

【问题讨论】:

  • job_time_begjob_time_end的数据类型是什么?
  • 没有FROM 子句?
  • @Popeye 数据类型为时间
  • @jarlh FROM 我在第二个查询中提到的订单
  • 使用明确的&lt;.. and .. &lt; 而不是BETWEEN 排除区间边界。

标签: php mysql sql overlap


【解决方案1】:

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

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

在您的查询中,逻辑是:

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 注入攻击。

【讨论】:

    【解决方案2】:

    这个怎么样?未测试,请检查您的数据库。

    and ( (job_time_beg between '10:00' and '12:00')
          or ('10:00' between job_time_beg and job_time_end) )
    

    您可以根据您对边缘时间的要求在&lt;&gt; 之间进行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      相关资源
      最近更新 更多