2017-02-25 77 views
1

我有兩列(日期字段,時間字段),它們存儲在字符串datetime和第一步是這兩個領域結合起來,這樣我可以比較它們與當前日期(我不知道我是否做對了)。第二步是編寫查詢,只有在這兩列的獲取日期接近當前日期時才應該選擇記錄。並且該日期應該在當前日期和當前日期之前4小時之間,因爲在那之後,如果沒有滿足某些條件,所有這些記錄都會發生。MySQL查詢檢查,如果一個日期接近當前的日期

格式欄的日期和時間:

event_date = 'yyyy/MM/dd'    
event_time = 'HH:mm' 

因此,這裏是我的查詢:

SELECT * 
FROM `events` 
WHERE DATE_SUB(NOW() , INTERVAL 4 HOUR) 
< ADDTIME(event_date, event_time) 

也許我應該首先這些字符串轉換爲日期,然後與他們或別的什麼工作?總而言之,如果我有一些數據與這些日期,例如:

1. 2017-02-26 10:00        
2. 2017-02-26 11:00 
3. 2017-02-27 10:00 

而且當前日期時間爲:2017-02-26 06:00 。在這種情況下,我只能得到1 record並當一個時間過得或2017-02-26 07:00的話,我會得到2 records

+0

(認真)考慮將日期和時間存儲爲一個單一的實體 - 並使用日期時間數據類型 – Strawberry

+0

我會的。例如,如果我有一個與日期時間數據類型的列我需要使用BETWEEN函數來實現我要找的結果? –

+0

一旦你已經整理出你的日期時間列,請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-tobe -a-very-simple-sql-query – Strawberry

回答

1

如果event_date是事件的日期和event_time是時間,你可以使用時間戳MySQL的功能將它們組合起來:

select event_date, event_time, timestamp(event_date, event_time) 
from events; 

但實際上將日期和時間信息實際存儲在單個字段中通常是個好主意,例如event_datetime

可以然後再編寫這樣的查詢:

select * 
from 
    events 
where 
    event_datetime between now() and now() + interval 4 hour; 

這將返回從現在開始所有事件和4小時的未來。或者,如果你想從過去的4小時以前發生的事件與嘗試:

event_datetime between now() - interval 4 hour and now(); 
+0

這兩個答案都很有用,但我需要選擇一個,所以我認爲這個答案更簡單,更好。 –

1

您應該將日期和時間轉換爲正確的日期時間數據類型。也就是說,您可以執行以下操作來完成您想要的操作:

SELECT * FROM `events` 
WHERE STR_TO_DATE(CONCAT(event_date,' ',event_time), '%Y/%m/%d %H:%i') 
    BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 4 HOUR) 

查詢將從現在開始到現在4小時之間返回所有行。

更新:我剛剛注意到@fthiella的答案,使用時間戳可能會比我提供的示例提供更好的性能。