【问题标题】:How to find time intersection between two times stored in mysql database如何查找存储在mysql数据库中的两个时间之间的时间交集
【发布时间】:2016-05-27 08:27:06
【问题描述】:

我面临的问题不是很复杂,这里有几个答案,但我没有看到任何可以解决我需要的问题。 所以我有一个表,其中包含两个类型为 VARCHAR 的字段,名为 timefrom 和 timeto。 这些字段以这种格式存储时间:12:00, 05:18,00:05 .... 我没有日期和秒,只有 24/h 时间格式的小时和分钟。 我有一个包含两个字段的表单,开始时间和结束时间。现在我想从数据库中选择用户开始时间和结束时间与数据库中的 timefrom 和 timeto 字段相交的所有行。 我有以下查询:

"SELECT * FROM reservation WHERE ((timeto>='$timefrom' AND timeto<='$timeto') OR (timefrom>='$timefrom' AND timefrom <='$timeto'))"

此查询适用于所有类型的交叉路口,但如果用户给出的时间适合存储在 DB 中的时间,则此查询无效。 例如,如果 DB timefrom=20:00 和 timeto=23:00 并且用户输入 starttime=21:00 和 endtime=22:00,则查询不会返回任何交集,它应该返回。 如果有人能向我展示一个可靠的解决方案,那将是一个很大的帮助。谢谢

【问题讨论】:

    标签: php mysql datetime


    【解决方案1】:

    将任何类型的日期/时间保存为简单的字符串不是一个好主意,因为您失去了处理 MySQL 本身提供的日期和时间的开箱即用功能。

    试试这样的:

    SELECT * FROM reservations
    WHERE
    TIME_FORMAT(timefrom, '%H:%i') >= '21:00' AND TIME_FORMAT(timeto, '%H:%i') <= '23:00'
    

    【讨论】:

    • 我的错,我没有测试它。这个有效(更新了答案)
    • 好的,谢谢它现在可以工作了,但是这个查询仍然没有解决一个问题。如果我的开始时间是 19:00 并且我的结束时间是 21:00(这意味着我的结束时间等于存储在 db 中的开始时间),那么查询会返回该行,但它不应该因为没有交集。我认为它是因为查询中的所有 = 运算符。有解决办法吗?
    • 我猜你应该只做 SELECT * FROM reservations WHERE TIME_FORMAT(timefrom, '%H:%i') &gt;= '21:00' AND TIME_FORMAT(timeto, '%H:%i') &lt;= '23:00' 并验证结束 > 在执行查询之前开始。如果您需要接受“23:00 到 2:00AM 之间”之类的参数,那么在运行查询之前需要做更多工作才能获得正确的结果。
    【解决方案2】:

    为什么不只检查用户输入开始时间或用户输入结束时间之一是否在时间限制之间。以及数据库开始时间和结束时间是否都在用户开始时间和结束时间之间。那将意味着一个十字路口。

    SELECT * FROM reservation WHERE ('$timefrom' BETWEEN timeto AND timefrom) OR ('$timeto' BETWEEN timeto AND timefrom) OR ('$timefrom' <= timefrom AND '$timeto' >= timeto)
    

    【讨论】:

    • Anf if $timefrom less and $timeto more than (timeto, timefrom) interval ?
    • 我的错,我错过了那个。谢谢,我会更新我的答案
    【解决方案3】:

    如果用户时间在timetotimefrom 之间,您可以添加第三个检查:

    OR (timefrom <= '$timefrom' AND timeto >='$timeto')
    

    这也会让你吐出中间有时间的行。

    MySQL 也提供了一个intersect 过滤器。看this。 在那里,您可以提供要查看的行,然后说您只想选择与您的值相交的行。

    【讨论】:

    • INTERSECT 过滤器用于检查两个或多个表中的值,而不是针对变量。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2015-02-07
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多