2014-02-06 61 views
0

这是关于时间表。用户选择1日期时间,我需要比较它与数据库,如果我没有其他时间和+ -2小时(四舍五入)..MySQL比较两个日期时间date_add

这两个日期时间保存在SQL“DATETIME”格式(yyyy -dd毫米HH:MM:SS)

条件是:用户DATETIME不能或多或少然后在1小时和59分钟(7199秒),作为DB-DATETIME

我尝试以下:

SELECT event FROM schedule 
WHERE '2014-08-02 12:00:00' > DATE_ADD(event, INTERVAL -7199 SECOND) OR 
WHERE '2014-08-02 12:00:00' < DATE_ADD(event, INTERVAL +7199 SECOND) 

该示例中的固定日期时间用于检查..真正的日期时间是字符串$ _COOKIE [“userdt “。很确定我很接近,但无法完成。

回答

0

写你的查询正确的做法是:

SELECT event 
FROM schedule 
WHERE '2014-08-02 12:00:00' > DATE_ADD(event, INTERVAL -7199 SECOND) AND 
     '2014-08-02 12:00:00' < DATE_ADD(event, INTERVAL +7199 SECOND) 

这改变了orand,并删除第二where

不过,我认为更好的方式来编写查询是:

SELECT event 
FROM schedule 
WHERE event > DATE_ADD('2014-08-02 12:00:00', INTERVAL -2 hour) and 
     event < DATE_ADD('2014-08-02 12:00:00', INTERVAL +2 hour); 

有几个原因这些变化。首先,interval 2 hourinterval 7199 second更容易理解。它阐明了查询的内容。 ><基本上实现相同的逻辑(好吧,每一端都有一秒的差异,但我的猜测并不重要)。

其次,尽量养成在where条款中对“常量”而不是“列”进行转换的习惯。这允许MySQL在event上使用索引进行查询。当event首先被函数处理时,MySQL不会(通常)在该列上使用索引。

+0

是的,我注意到第二个WHERE,只要我发送这个问题,但感谢您的建议,这将是有益的。 –

0

除了错误的sql sensece,它是用户输入,你应该比较而不是表中的字段。这应返回2014年8月2日10:00:00和2014年8月2日

之间14:00:00

SELECT event FROM schedule 
WHERE event > DATE_ADD('2014-08-02 12:00:00', INTERVAL -7199 SECOND) 
AND event < DATE_ADD('2014-08-02 12:00:00', INTERVAL +7199 SECOND) 

UPDATE

无论如何场我错过了OR这将然后在2014-08-02 14:00:00之前和2014-08-02 10:00:00之后返回任何东西,因此实际上将返回所有内容。 (感谢戈登注意到:P)

+0

谢谢,它的工作.. –