这是关于时间表的。用户选择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”]。很确定我很亲密,但无法完成。
答案 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 hour
比interval 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)