php - 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
解决方案
两个时间段重叠的逻辑是:
- 第一个在第二个结束之前开始。
- 第一个在第二个开始之后结束。
在您的查询中,逻辑是:
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 注入攻击。
推荐阅读
- javascript - 从 Javascript Promises 存储文件对象
- dm-script - 如何移动 SI 图像中的列
- sql - 如何将 Azure SQL 数据库连接到托管在不同服务器上的 ASP.NET 网站
- cassandra - 如何将第三个节点添加到 2 节点 Cassandra 集群?
- npm - NPM Workspaces monorepo - 以 root 身份共享本地包的分发文件夹,而不是整个源文件
- javascript - ExtJs 树面板如何更改节点复选框的背景图像?
- kotlin - 我们需要在 kotlin 中锁定不可变列表吗?
- arduino - 我已经选择了 ESP32 wrover 模块,但它仍然显示错误“请选择相应的模块”
- python - 如何将 sub_list 中的特定元素(列表中的列表)附加为此 sub_list 中的新元素?
- python - 如何了解 AWS SageMaker Autopilot 结果