检查时间重叠(ruby / mysql)

时间:2011-03-22 10:20:34

标签: mysql ruby-on-rails ruby

我有两列:start_time和end_time,如下所示:“00:00:05”,“00:00:10”(mysql时间)。

我的问题如下。如何验证一条记录是否与表中已有的任何其他记录重叠,以使其唯一,例如:

<00>“00:00:10”,“00:00:20”重叠“00:00:05”,“00:00:15”

由于

4 个答案:

答案 0 :(得分:1)

逻辑

  • 您所测试记录的开始时间和结束时间都不得在任何数据库记录的开始和结束时间之间 - 这将涵盖任何部分重叠以及内部重叠
  • 如果test_start&lt;
  • ,则检测到外部重叠。 db_start AND test_end&gt; db_end

在SQL中我会制定

SELECT count(*) FROM Tab as T WHERE
   :param_start BETWEEN T.start_time AND T.end_time OR
   :param_end   BETWEEN T.start_time AND T.end_time OR
   (:param_start <= T.start_time AND
    :param_end >= T.end_time
   )

如果计数是&lt;&gt; 0你有重叠

答案 1 :(得分:0)

进入数据库的任何记录本质上都是唯一的。如果您尝试验证唯一属性,例如“登录”,则必须添加'validates:login,:uniqueness =&gt;如果是'到模型的行,而且在迁移文件中,您将要添加以下行't.string:login,:unique =&gt; true'...这可以防止任何重叠

欢呼声

答案 2 :(得分:0)

select start_time, end_time
from tbl
where start_time < "00:00:20"
  and "00:00:10" < end_time
limit 1;

注意:

  1. Limit 1用于快速返回结果,而无需查找/统计所有重叠
  2. 双重开始
  3. 找到重叠时,输出样本重叠记录

答案 3 :(得分:0)

我写了一个宝石,可以帮助你解决这个问题。

https://github.com/robinbortlik/validates_overlap

自述文件是一个如何使用它的例子。但此时只适用于Rails 3。

欢呼声

RobinBortlík