【问题标题】:Select all timestamps that is between range in MySQL选择 MySQL 中范围之间的所有时间戳
【发布时间】:2014-03-25 16:14:00
【问题描述】:

我正在为我的项目开发类似日历的功能。

我有一个如下表:

ID | Title             |Where     |tri| Start      | End        | tro
______________________________________________________________________
"4"|"Planingfrenzy"    |"Street 8"|"0"|"1395835200"|"1395846000"|"1"
"5"|"Other meeting"    |"Road 8"  |"0"|"1395140400"|"1395158400"|"1"
"6"|"Third meeting"    |"Lane 8"  |"0"|"1395819000"|"1395824400"|"1"
"8"|"Weekend at cyprus"|"Cyprus"  |"0"|"1395928800"|"1396162800"|"1"

我在选择一天内发生的所有事件时遇到问题。 我尝试了以下两个查询,但它们只返回在同一天开始和结束的那些事件。

/*
   Start is a unixtimestamp for the beginning of the day
   End is a unixtimestamp for the end of the day
*/

//This Returns to many events since all events that ends before the end timestamp is a match etc. 
SELECT * FROM events WHERE (start > ? OR end<?) 

//This matches all events that start and end at the same day. But a multi day event like "Weekend at cyprus" isn't returned since it is out of range
SELECT * FROM events WHERE (start > ? AND end<?)

如果开始/结束范围“触及”查询的时间戳范围,MySQL 或 PHP 中有什么方法可以匹配吗?

【问题讨论】:

  • ? 使用什么值?
  • 您想要某一天的所有事件(即 2015 年 3 月 7 日的所有事件)还是只持续一天的所有事件?
  • @GordonLinoff 正如评论中提到的那样? = 是当天的第一个/最后一个时间戳。
  • @AndreschSerj 我想要某个日期的所有事件。例如:我有一个从 3 月 7 日 13 点开始到 3 月 9 日 12 点结束的活动。如果我检查 3 月 8 日的活动,我仍然希望该活动出现!

标签: php mysql unix-timestamp date-range


【解决方案1】:

假设?这两个值是当天最早和最新的值,我想你想要:

where start < (?end) and end > (?start)

也就是说,当一个的开始在另一个的结束之前时存在重叠,反之亦然。

在此答案中,(?end) 旨在成为当天的最后一个时间戳,(?start) 旨在成为第一个。

【讨论】:

  • 很烦人,我自己没有弄清楚这一点!谢谢,很高兴!
【解决方案2】:

在这种情况下,正确的表达式是使用 BETWEEN:

SELECT * FROM events WHERE 1 AND date BETWEEN start AND end

MySQL Documentation

【讨论】:

    【解决方案3】:

    我将假设您想要捕获在您定义的时间范围内具有开始时间或结束时间的任何事件。

    我实际上并没有对您的数据集进行测试,但这应该会让您朝着正确的方向前进:

    SELECT * FROM events 
    WHERE (Start >= :start AND Start < :end)
    OR    (End >= :start AND End < :end)
    

    因为您在问题中包含了 PHP 标记,所以这是获取给定日期所需的“开始”和“结束”时间戳的简单方法,在我的示例中,我将使用“今天”作为目标日期。

    $timezone = new DateTimeZone('UTC');
    $date = new DateTime('today', $timezone);
    
    $start = $date->getTimestamp();
    $end   = $date->add(new DateInterval('P1D'))->getTimestamp();
    

    希望对你有帮助。

    【讨论】:

    • @Strawberry 是 SQL 还是时间戳在困扰您? :)
    • @Strawberry,我想我明白你在说什么,但 Gordon 的解决方案假定开始时间和结束时间都在所需范围内,而我的解决方案假定 两者之一 i> 开始或结束时间在给定范围内。这还取决于您如何计算开始/结束时间,我只是想举一个例子,让 OP 朝着正确的方向前进。
    • 没有。想想看。如果你愿意,可以画一个图表。
    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多