2012-04-23 47 views
0

我有一張表,其中包含一個開始日期和結束日期的事件列表。我能順利拿到今天發生的事件列表如下:根據開始日期和結束日期查詢今天和今天之間的一週內發生的多日事件列表

SELECT * FROM event WHERE CURDATE() BETWEEN start_date and end_date 

或者發生整整一週的今天與下列事件列表:

SELECT * FROM event WHERE DATE_ADD(CURDATE() INTERVAL 1 WEEK) BETWEEN start_date and end_date 

但是,我想名單事件發生在今天和今天之後的任何時間(包括今天)。請記住,每個事件跨越多個天,並由開始日期和結束日期來定義,而不是一天的事件。

有沒有一種簡單的方法來查詢這個,或者是否更容易通過上面的第一個查詢循環遍歷PHP中的每一天(從今天到現在每隔一天取代CURDATE)?

+0

只是爲了澄清是否只想起始日期從今天今天,1周間下跌?還是它必須是start_date和end_date? – hkf 2012-04-23 23:30:46

+0

嗨,喬納森,謝謝你的幫助,對於我在辦公室呆了幾天的延誤感到抱歉。今天我將通讀並嘗試您的解決方案,如果它能起作用,我會將其標記爲答案! – 2012-04-30 16:40:22

+0

@hkf數據庫中的每個事件都有一個start_date值和一個end_date值。我正在查找一個查詢,它會給我提供符合NOW()和NOW()+ 1周之間任何時間的任何事件的每個事件的查詢在事件 – 2012-04-30 16:49:33

回答

1

我喜歡將這樣的問題可視化。據我理解你的問題,有四種類型的事件應該返回:

  |-------------------- WEEK ---------------------| 
      |            | 
      |   |========== EVENT ==========|   | 
    |========== EVENT ==========|      | 
      |      |========== EVENT ==========| 
    |========================= EVENT =========================| 
      |            | 
      |-----------------------------------------------| 

這意味着我們有:在一週的開始和結束

  • 事件;
  • 在本週前開始並在本週結束的事件;
  • 一週內開始,一週後結束的事件;
  • 在一週前開始並在一週後結束的事件。

這個翻譯成SQL提供了以下:

SELECT * 
FROM events 
WHERE (start_date >= CURDATE() AND end_date <= CURDATE() + INTERVAL 1 WEEK) 
    OR (start_date < CURDATE() AND end_date >= CURDATE()) 
    OR (start_date <= CURDATE() + INTERVAL 1 WEEK 
     AND end_date > CURDATE() + INTERVAL 1 WEEK) 
    OR (start_date < CURDATE() AND end_date > CURDATE() + INTERVAL 1 WEEK); 

我以前>=<=的一個星期內的日期。通過這種方式,我們可以確保在一週的開始或結束時開始或結束的事件也包含在內。


假設start_date <= end_date是所有行真,簡單的方法是:

SELECT * 
FROM events 
WHERE start_date <= CURDATE() + INTERVAL 1 WEEK 
    AND CURDATE() <= end_date 
+0

的start_date和end_date內可以簡化爲WHERE(start_date <= CURDATE()+ INTERVAL 1 WEEK)和(CURDATE()<= end_date)' – 2012-04-24 00:21:31

+0

...假設這總是正確的: start_date <= end_date' – 2012-04-24 00:23:51