选择MySQL中范围之间的所有时间戳

时间:2014-03-25 16:14:00

标签: php mysql unix-timestamp date-range

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

我有一张如下表格:

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"

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

/*
   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中是否存在某种匹配方式?

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

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

MySQL Documentation

答案 2 :(得分:0)

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

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

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();

我希望有所帮助。