我使用PHP创建了一个DateTime对象并将其插入数据库列的预定时间 - 如下所示:2017-03-13 07:30:00
现在我想运行查询并选择具有相同时间或时间小于当前时间的行 - 假设当前时间为2017-03-13 08:30:00
。我想忽略秒,因为那些并不重要。
我这样做:
SELECT * FROM fp_mail_reminder
WHERE DATE_FORMAT(scheduledtime, '%d.%m.%Y %k:%i') <= DATE_FORMAT('2017-03-13 08:30:00', '%d.%m.%Y %k:%i')
AND active = 1
ORDER BY id ASC
但是查询不会产生已插入2017-03-13 07:30:00的行。如果我更改日期为:2017-03-12 07:30:00 - 所以我改变了一天,结果即将到来。
有人可以说为什么会这样吗?
答案 0 :(得分:1)
您正在做的是比较字符串值而不是实际日期值。这里的问题是&#39; 21.01.2017&#39;的字符串比较。大于&#39; 01.03.2017&#39;虽然日期较旧。这是因为字符串比较逐个字符地比较,从第一个开始:
21.01.2017
=&gt;的第一个字符2
01.03.2017
=&gt;的第一个字符0
0小于2(即使是Unicode,Latin1,ASCII,无论你的字符集和校对是什么)。
这就是ISO日期格式为YYYY-MM-DD HH:mm:ss
的原因。使用这种格式,您首先将最重要的部分包含在内,并通过降低重要性进行比较,即使使用字符串表示也是如此。
如果你真的想要消除这些秒数,我建议减少这个数值:
WHERE scheduledtime - interval second(scheduledtime) second <= cast('2017-03-13 08:30:00' as datetime)
答案 1 :(得分:0)
试试这个
SELECT * FROM fp_mail_reminder
WHERE DATE_FORMAT(scheduledtime, '%Y-%m-%d %k:%i') <= DATE_FORMAT('2017-03-13 08:30:00', '%Y-%m-%d %k:%i')
AND active = 1
ORDER BY id ASC