我有一个日历,显示给定月份和年份的事件。每个事件都有DATETIME
个字段中的开始时间和结束时间。
$org = $_SESSION['org_id'];
$month = 5;
$year = 2013;
以下内容仅检索在指定月/年内开始或结束的事件:
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'))
它不会返回在指定月/年之外开始和结束的事件。
离。 time_start='2013-04-07 12:00:00' time_end='2013-06-07 12:00:00'
- 我的2013年5月查询中未找到该事件。
如何选择开始,结束或交叉指定月/年的事件?
答案 0 :(得分:3)
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 :(得分:0)
使用BETWEEN
$event_date = date('Ymd',mktime(0,0,0,$month,1,$year));
SELECT * FROM events WHERE org='$org' AND date($event_date) BETWEEN time_start AND time_end;
此查询搜索中间具有该日期的所有事件。
试试这个SQLFiddle来了解我的观点。
希望这有帮助。
答案 2 :(得分:0)
尝试将此添加到AND
-
((MONTH(time_start)<'$month' AND YEAR(time_start)<='$year') AND
(MONTH(time_end)>'$month' AND YEAR(time_end)>='$year'))
所以你的查询现在变得(有点笨重,但它应该让你朝着正确的方向) -
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')))
答案 3 :(得分:0)
$start = date('Y-m-d', mktime((0,0,0,$month,1,$year)));
$end = date('Y-m-d', mktime((23,59,59,$month+1,0,$year)))
你需要检查四个条件:
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)
)