PHP / MySQL日期和时间比较(无秒)

时间:2017-03-13 11:13:04

标签: php mysql

我使用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 - 所以我改变了一天,结果即将到来。

有人可以说为什么会这样吗?

2 个答案:

答案 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