簡體   English   中英

MySQL查詢 - 按月和年查找范圍內的日期

[英]MySQL Query - Find dates within range by month and year

我有一個日歷,顯示給定月份和年份的事件。 每個事件在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月查詢中未找到該事件。

如何選擇開始,結束或交叉給定月/年的事件?

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對字符串感到滿意。

使用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看看我的觀點。

希望這可以幫助。

嘗試將此添加到您的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')))
$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)))

你需要檢查四個條件:

  • $ start和$ end之間的事件開始日期
  • Evend結束日期在$ start和$ end之間
  • $ event在事件開始日期和事件結束日期之間開始
  • $ event在事件開始日期和事件結束日期之間結束

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM