1

特定の月と年のイベントを表示するカレンダーがあります。各イベントには、フィールドに開始時刻と終了時刻が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 月のクエリでイベントが見つかりません。

特定の月/年に開始、終了、またはクロスオーバーするイベントを選択するにはどうすればよいですか?

4

4 に答える 4

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 はまだ文字列に満足しています。

于 2013-05-07T20:20:09.607 に答える
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)))

また、次の 4 つの条件を確認する必要があります。

  • $start と $end の間のイベント開始日
  • $start と $end の間のイベント終了日
  • $start イベント開始日とイベント終了日の間
  • $end イベント開始日とイベント終了日の間

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)
)
于 2013-05-07T20:52:01.927 に答える
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')))
于 2013-05-07T20:35:25.590 に答える