MySQL Query - Find dates within range by month and year
我有一个日历,显示给定月份和年份的事件。 每个事件在
1 2 3 | $org = $_SESSION['org_id']; $month = 5; $year = 2013; |
以下仅检索在指定月/年内开始或结束的事件:
1 2 3 | SELECT * FROM events WHERE org='$org' AND ((MONTH(time_start)='$month' AND YEAR(time_start)='$year') OR (MONTH(time_end)='$month' AND YEAR(time_end)='$year')) |
它不会返回在指定月/年之外开始和结束的事件。
恩。
如何选择开始,结束或交叉给定月/年的事件?
1 2 3 4 5 | SELECT * FROM events WHERE org='$org' AND time_start < '$year-$month-01 00:00:00' + INTERVAL 1 MONTH AND time_end > '$year-$month-01 00:00:00' ; |
如果你对mysql很好,你甚至可以将字符串转换为日期,其他数据库就像那些东西,但mysql对字符串感到满意。
1 2 |
你需要检查四个条件:
- $ start和$ end之间的事件开始日期
- Evend结束日期在$ start和$ end之间
- $ event在事件开始日期和事件结束日期之间开始
- $ event在事件开始日期和事件结束日期之间结束
1 2 3 4 5 6 7 8 | SELECT * FROM events WHERE org='$org' AND ( (start_time BETWEEN '$start' AND '$end') OR (end_time BETWEEN '$start' AND '$end') OR ('$start' BETWEEN start_time AND end_time) OR ('$end' BETWEEN start_time AND end_time) ) |
尝试将此添加到您的
1 2 | ((MONTH(time_start)<'$month' AND YEAR(time_start)<='$year') AND (MONTH(time_end)>'$month' AND YEAR(time_end)>='$year')) |
所以你的查询现在变得(有点笨重,但它应该让你朝着正确的方向) -
1 2 3 4 5 6 | SELECT * FROM events WHERE org='$org' AND (((MONTH(time_start)='$month' AND YEAR(time_start)='$year') OR (MONTH(time_end)='$month' AND YEAR(time_end)='$year')) OR ((MONTH(time_start)<'$month' AND YEAR(time_start)<='$year') AND (MONTH(time_end)>'$month' AND YEAR(time_end)>='$year'))) |
使用BETWEEN
1 2 3 |
此查询搜索中间具有该日期的所有事件。
试试这个SQLFiddle看看我的观点。
希望这可以帮助。