Question

I'm working on a calendar like feature to a project of mine.

I have a table like the following:

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"

I have a problem selecting alla events that happens in one day. I tried the following two queries, but they only return those events thats start and end at the same day.

/*
   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<?)

Is there some way in MySQL or PHP to match if start/end range "touches" in the queried timestamp range?

Was it helpful?

Solution

Assuming that the two values of ? are the earliest and latest values in the day, I think you want:

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

That is, there is an overlap when the start of one is before the end of the other, and vice versa.

In this answer (?end) is intended to be the last timestamp of the day and (?start) is intended to be the first.

OTHER TIPS

In this case, the correct expression is to use BETWEEN:

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

MySQL Documentation

I'm going to assume that you want to catch any event that has either a start time or an end time within your defined time range.

I didn't actually test on your dataset but this should get you headed in the right direction regardless:

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

And because you have included the PHP tag in your question, here is an easy way to get the "start" and "end" timestamps you need for a given date, in my example, I will use "today" as the target date.

$timezone = new DateTimeZone('UTC');
$date = new DateTime('today', $timezone);

$start = $date->getTimestamp();
$end   = $date->add(new DateInterval('P1D'))->getTimestamp();

I hope that helps.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top