2017-02-25 80 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的答案,使用时间戳可能会比我提供的示例提供更好的性能。