我有一個表有一個'start_date'字段和一個字段'end_date'。當前日期介於'start_date'和'end_date'之間時,項目被視爲活動。我如何找到所有在未來30天內被認爲是有效的項目。使用mysql查詢其他日期之間的日期
回答
假設start_date
和end_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
在「NOW」之前開始並在未來30天內運行的項目如何? –
@koala_dev:好點。我添加了一個可能情況的粗略例子,並添加了一個謂詞(WHERE子句),它應該滿足要求。 – spencer7593
+1 Nice work @ spencer7593。我認爲你的更新正是OP需要解決他的問題。 –
- 1. MySQL查詢日期之間
- 2. 在mongodb中查看其他2個日期之間的日期
- 3. MySQL查詢 - 日期/之間的問題
- 4. 查詢日期之間的mysql
- 5. MySQL查詢發現日期小於其他日期
- 6. 日期之間的查詢
- 7. 檢查日期是否在兩個其他日期之間
- 8. mysql查詢兩個日期字段之間的日期
- 9. 日期之間的MySQL日期
- 10. MySQL:插入日期時間到其他日期時間字段
- 11. 檢查2個日期之間的時間相交其他2個日期
- 12. 2個其他日期之間的日期,不考慮年份
- 13. 用兩個date_time列之間的當前日期查詢日期
- 14. 在一系列日期之間查找日期的SQL查詢
- 15. MySql查詢兩個日期之間的任何日期是在兩個日期之間
- 16. MySQL查詢日期
- 17. MySQL查詢日期
- 18. 間隔日期之間的查詢
- 19. 錯過使用mysql的日期之間的日期
- 20. Mysql查詢檢索使用兩個日期之間的記錄
- 21. Mysql-從日期到日期之間的日期
- 22. 與日期之間的日期時間和查詢的查詢問題
- 23. 在日期時間更換日期與其他日期
- 24. 檢查日期是否在mysql中的兩個日期之間
- 25. MySQL之間的日期
- 26. PHP MySQL之間的日期
- 27. 寫一條查詢,找到你的日期和日期之間的日期B
- 28. 使用日期之間的Mysql加入
- 29. 在mysql中的開始日期和結束日期之間查找日期
- 30. SQL查詢來選擇日期之間的日期 - 30天
您能否更清楚地瞭解您需要的內容,整個30天內活動的項目或活動的所有項目(無論dur ation)在30天期間? –