mysql 检查两列之间的预订重叠时间
mysql check booking overlap time between two columns
我有一个 table 预订,其中有两列 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.
分配下一个预订
请看sqlfiddle
sqlfiddle
这个怎么样?未测试,请检查您的数据库。
and ( (job_time_beg between '10:00' and '12:00')
or ('10:00' between job_time_beg and job_time_end) )
您可以根据您对边缘时间的要求在 <
和 >
之间进行转换。
两个时间段重叠的逻辑是:
- 第一个在第二个结束之前开始。
- 第一个在第二个开始后结束。
在您的查询中,逻辑是:
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 注入攻击。
我有一个 table 预订,其中有两列 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.
分配下一个预订请看sqlfiddle sqlfiddle
这个怎么样?未测试,请检查您的数据库。
and ( (job_time_beg between '10:00' and '12:00')
or ('10:00' between job_time_beg and job_time_end) )
您可以根据您对边缘时间的要求在 <
和 >
之间进行转换。
两个时间段重叠的逻辑是:
- 第一个在第二个结束之前开始。
- 第一个在第二个开始后结束。
在您的查询中,逻辑是:
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 注入攻击。