防止将重叠的时间戳范围插入数据库
Prevent insertion of overlapping timestamp ranges to database
你好,希望有人能帮助我。
假设我 table 有以下
姓名文字
没有时区的 startTime 时间戳
没有时区的 endTime 时间戳
这是我正在尝试做的事情:
我正在尝试检查即将添加到数据库的时间是否会与 table 上已有的时间重叠。
示例:
name startTime endTime
---------|------------------------|----------------------
tommy | 2019-07-10 08:30:00 | 2019-07-10 10:30:00
tommy | 2019-07-10 10:31:00 | 2019-07-10 11:30:00
tommy | 2019-07-10 07:30:00 | 2019-07-10 09:00:00 <=== if I click enter to enter this tird schedulle for this user, the sistem will give me a conflict message because this user already has a schedulle that start from 2019-07-10 08:30:00 to 2019-07-10 10:30:00 on our first row of the table.
至于我要插入数据库的代码,我只有这么简单php
$sql = "insert into horarios (name, startTime, endTime) values ('$name', '$startTime', '$endTime');";
$res = @pg_query ($con, $sql);
if ($res == NULL){
echo "Query failed.";
exit (0);
}
让数据库来做繁重的工作!您可以使用 timestamp ranges and an exclusion constraint 来防止插入重叠的日期范围:
alter table horarios
add constraint horarios_range_overlap
exclude using gist (tsrange(startTime, endTime) with &&)
数据库使用时间戳作为边界建立一个tsrange,然后使用运算符&&
确保没有重叠。有冲突的记录被拒绝。
默认情况下,时间戳范围包括下限和上限 - 但可以修改。
你好,希望有人能帮助我。
假设我 table 有以下
姓名文字 没有时区的 startTime 时间戳 没有时区的 endTime 时间戳
这是我正在尝试做的事情:
我正在尝试检查即将添加到数据库的时间是否会与 table 上已有的时间重叠。
示例:
name startTime endTime
---------|------------------------|----------------------
tommy | 2019-07-10 08:30:00 | 2019-07-10 10:30:00
tommy | 2019-07-10 10:31:00 | 2019-07-10 11:30:00
tommy | 2019-07-10 07:30:00 | 2019-07-10 09:00:00 <=== if I click enter to enter this tird schedulle for this user, the sistem will give me a conflict message because this user already has a schedulle that start from 2019-07-10 08:30:00 to 2019-07-10 10:30:00 on our first row of the table.
至于我要插入数据库的代码,我只有这么简单php
$sql = "insert into horarios (name, startTime, endTime) values ('$name', '$startTime', '$endTime');";
$res = @pg_query ($con, $sql);
if ($res == NULL){
echo "Query failed.";
exit (0);
}
让数据库来做繁重的工作!您可以使用 timestamp ranges and an exclusion constraint 来防止插入重叠的日期范围:
alter table horarios
add constraint horarios_range_overlap
exclude using gist (tsrange(startTime, endTime) with &&)
数据库使用时间戳作为边界建立一个tsrange,然后使用运算符&&
确保没有重叠。有冲突的记录被拒绝。
默认情况下,时间戳范围包括下限和上限 - 但可以修改。