php - 防止两个保留之间发生冲突的代码逻辑

标签 php oracle algorithm

我正在使用 PHP 5.1 开发一个 session 室预订系统,我需要强制执行一种机制,即任何两个用户都不能在同一天的同一时间预订房间。系统将 time_in、time_out、from_date、to_date 存储在数据库中。我应该使用什么算法来防止冲突?

我最初想保留 time_in 和 time_out 字段 UNIQUE在数据库中,但在用户 A 预订 9 to 5 on 12-05-2014 的情况下即

**User A** time_in => 09:00 time_out => 05:00 reservation_date => 12/05/2014

用户 B 在同一天来预订 12 到 3 人,即

**User B** time_in => 12:00 time_out => 03:00 reservation_date => 12/05/2014

time_in time_out 不同,系统会接受预订。所以这个算法会失败。

此外,人们还可以选择预订几天,例如我想预订 1 号房间 10 天,每天从 9 点到 5 点。那么有人可以帮我解决这里的算法问题吗?

最佳答案

根据您的描述,我假设预订如下

房间:1 time_in: 9:00, time_out: 13:00, from_date:11/01/2014to_date:11/03/2014

表示在 11 月 1 日、2 日和 3 日这三天,房间预订时间为每天上午 9 点至下午 1 点。也就是说,这并不意味着预订从 11 月 1 日上午 9 点开始,一直持续到 11 月 3 日下午 1 点。

根据这些假设,需要解决的根本问题是确定两个保留是否会重叠。为了简洁起见,我将在此处将保留表示为元组:

[房间,time_in,time_out,from_date,to_date]

如果房间相同且时间范围和日期范围重叠,则两次预订重叠。也就是说,给定保留 [r,a,b,c,d][R,A,B,C,D],如果 r = Ra..bA..B 重叠,c..dC.. D。当且仅当

r = R   and   b >= A and a <= B    and   c >= D and d <= C

使用上面的表达式,您可以编写一个查询来计算数据库中所有现有的元组,这些元组将与建议的新保留冲突,如果计数为零,则插入建议的保留。 (小写字母将是代表建议保留的查询参数,大写字母将是数据库中的列名称。我将留给您找出执行计数和条件插入的 SQL。)

请注意,重叠比较是否正确可能不会立即显而易见。通过查看两个时间(或日期)范围可能发生的所有方式,您可以说服自己它们是。下面显示的是时间范围的可能关系。括号和尖括号旨在帮助可视化每个范围的两个端点。

(a   b)   <A   B>   condition b >= A fails, no overlap
(a   <A   b)   B>   both conditions met, overlap
(a   <A   B>   b)   both conditions met, overlap
<A   (a   b)   B>   both conditions met, overlap
<A   (a   D>   b)   both conditions met, overlap
<A   B>   (a   b)   condition a <= B fails, no overlap

关于php - 防止两个保留之间发生冲突的代码逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25196411/

相关文章:

sql - 使用 SQL 查询统计单词出现次数

oracle - 如何找出查询的字段类型

java - 理解源自代码的大 O 符号

java - 单链表递归快速排序的基本情况

php - 无法从 MySQL 查询获得正确的输出

php - 搜索阿拉伯名称丢弃 "أ"之间的差异, "ا"在 mysql

php - 如何在临近到期时间时向用户发送通知(每年)

php - Raspberry 4 (Buster) 上的 mysql/mariaDB 连接/权限出现问题; phpMyadmin 出错; MySQL Workbench 没有连接

sql - PL/SQL : SELECT INTO raises ORA-00947

c - Codechef十月挑战 child 旅行的错误答案?