PHP时间过滤和MYSQL过滤

时间:2011-12-18 09:31:30

标签: php mysql time filter filtering

我有3列:Day,start_schedule和end_schedule。

   Day  |  start_schedule | end_schedule
 -------|-----------------|--------------
 Monday |     1:00        |   3:00
 Monday |     6:00        |   8:00
 Monday |     8:00        |  10:00

我还在学习php。如果我的输入开始时间表和结束时间表根据数据库中存储的时间有效,我将如何过滤?

例如,如果我想添加时间

  • start_schedule = 3:00和end_schedule = 7:00

因为6:00 - 8:00您不应该被允许添加此计划。

  • start_schedule = 7:00和end_schedule = 11:00

由于6:00 - 8:008:00 - 10:00,您不应该被允许添加此计划。

1 个答案:

答案 0 :(得分:2)

如果是MySQL存储,则在尝试插入新记录之前,需要执行SQL查询以检索重叠当前新记录的记录。然后,如果您的重叠检查没有返回任何行,您可以安全地插入您的行(如果所有这些都在交易中完成,否则有人可能在您的支票和您的插入之间插入了一些内容,执行交易和将 lock 放在表上,这样就没有人可以插入你正在检查和插入的whild。

基本上要找到重叠的行,你需要这样的查询(myday mystart和myend是你要插入的新值):

SELECT count(*)
 FROM mytable
 WHERE Day=myday
  AND mystart < end_schedule
  AND myend > start_schedule

如果您有大量记录可以简单地执行和EXISTS操作而不是计数,则可以优化此查询(因为1个重叠期决定您不应该继续)。

现在,如果你有一些重叠的日子,则会更复杂。实际上,您无法在数据库模型中存储这些项目。如果我想在星期天的22:00开始,并在星期一的04:00或者星期四的06:00结束......那么也许你正在打破你的计划,插入几个计划,每天一个。然后你会仔细检查你所有的scheds部分是否可以插入,而不仅仅是其中之一。当然,在交易中仍然会做所有这些事情。

修改

重叠测试:

     s------------------------e
  s1----------e1
                        s2----------e2
         s3----------e3
  • s < e1
  • s < e2
  • s < e3
  • e > s1
  • e > s2
  • e > s3