MySQL将两个日期时间与date_add进行比较

时间:2014-02-06 12:21:18

标签: mysql datetime compare schedule dateadd

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

两个日期时间都以SQL“DATETIME”格式保存(yyyy-dd-mm hh:mm:ss)

条件是:user-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”]。很确定我很亲密,但无法完成。

2 个答案:

答案 0 :(得分: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)

这会将or更改为and并删除第二个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不会(通常)使用列上的索引。

答案 1 :(得分:0)

除了拼写sql sentece之外,它是你应该比较的用户输入而不是表中的字段。这应返回2014-08-02 10:00:00和2014-08-02 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)

<强>更新

我错过了 OR ,然后在2014-08-02 14:00:00之前和2014-08-02 10:00:00之后返回任何内容,所以实际上将返回所有内容。 (感谢Gordon注意到:P)