2013-07-16 131 views
1

我有一個表有一個'start_date'字段和一個字段'end_date'。當前日期介於'start_date'和'end_date'之間時,項目被視爲活動。我如何找到所有在未來30天內被認爲是有效的項目。使用mysql查詢其他日期之間的日期

+1

您能否更清楚地瞭解您需要的內容,整個30天內活動的項目或活動的所有項目(無論dur ation)在30天期間? –

回答

3

假設start_dateend_date是DATETIME,你要比較的日期和時間的組件,你可以做這樣的事情:

SELECT a.* 
    FROM atable a 
WHERE a.start_date >= NOW() 
    AND a.end_date <= NOW() + INTERVAL 30 DAYS 

如果開始日期和結束日期是DATE(而不是DATETIME),您可能只想比較DATE部分(不考慮時間分量)

SELECT a.* 
    FROM atable a 
WHERE a.start_date >= DATE(NOW()) 
    AND a.end_date <= DATE(NOW()) + INTERVAL 30 DAYS 

你實際上可能需要(而不是小於或等於)的結束日期小於比較。你需要確定你想在這個邊緣情況下得到什麼結果。並且間隔可能需要指定爲29天,具體取決於您定義「未來30天」的方式。


問:什麼之前現在就開始,並會在接下來的30天運行一次的項目?

- 答:我想我明白你在問什麼。

我認爲您想要檢索任何時間點之間start_date和end_date任何時間之間的任何時間之間從現在到30天之間的任何時間。我可以看到我上面的查詢沒有回答這個問題。現在,我將僅考慮「start_date < end_date」的情況,並擱置start_date不小於end_date,或者start_date或end_date或兩者均爲NULL的情況。

我們可以描繪出可能情況的東西(而不是粗暴地)是這樣的: 豎條代表現在NOW + 30 小於號表示「起始日期」 大於號代表「END_DATE」 破折號代表DATETIME的愨起始日期日期和結束日期

 NOW  NOW+30 
<---> |  |    case 1: end_date < NOW() 
    <---|----> |    case 2: NOW() between start_date and end_date 
    <--|-------|---->   case 3: NOW() > start_date and NOW+30 < end_date 
     | <---> |    case 4: both start_date and end_date between NOW() and NOW()+30 
     | <--|--->   case 5: start_date between NOW() and NOW()+30 and end_date > NOW+30 
     |  | <--->  case 6: start_date > NOW()+30 


    <--->  |    case e1: end_date = NOW() 
    <--|------->    case e2: start_date > NOW() AND end_date = NOW()+30 
     <---> |    case e3: start_date = NOW() and end_date < NOW()+30 
     <------->    case e4: start_date = NOW() and end_date = NOW()+30 
     <-------|-->   case e5: start_date = NOW() and end_date > NOW()+30 
     | <--->    case e6: start_date > NOW() AND end_date = NOW()+30 
     |  <--->   case e7: start_date = NOW()+30 

我想你問到返回滿足的情況下2直通5行,這是所有的情況下,除了案例1和6

如果我們可以寫一個範圍謂詞測試案例1和6,然後否定,它應該給我們你想要的。事情是這樣的:)功能

WHERE NOT (end_date < NOW() OR start_date > NOW() + INTERVAL 30 DAYS) 

如果開始日期和結束日期爲DATE,比較只是日期部分,包裹在日期的NOW()函數(:

若要考慮時間組件處理日期時間:

WHERE NOT (end_date < DATE(NOW()) OR start_date > DATE(NOW()) + INTERVAL 30 DAYS) 

我擱置古怪情況下,起始日期> END_DATE,起始日期= END_DATE,起始日期IS NULL日期,結束日期IS NULL等我的邊緣的情況下也省略討論(E1直通E7),例如start_date = NOW(),end_date = NOW()等。爲了完整起見,您可能需要檢查是否用相同的謂詞適當地處理了這些情況。


DOH!

這只是我明白了這一點:

WHERE NOT (a < n OR b > t) 

相當於本(至少不是空值)

WHERE (a >= n AND b <= t) 

所以這個謂詞應該是等價的:

WHERE end_date >= NOW() AND start_date <= NOW() + INTERVAL 30 DAYS 
+1

在「NOW」之前開始並在未來30天內運行的項目如何? –

+0

@koala_dev:好點。我添加了一個可能情況的粗略例子,並添加了一個謂詞(WHERE子句),它應該滿足要求。 – spencer7593

+0

+1 Nice work @ spencer7593。我認爲你的更新正是OP需要解決他的問題。 –