【问题标题】:MySQL compare two datetimes with date_addMySQL 将两个日期时间与 date_add 进行比较
【发布时间】:2014-02-06 12:21:18
【问题描述】:

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

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

条件是:user-DATETIME 不能大于或小于 DB-DATETIME 的 1 小时 59 分钟(7199 秒)

我尝试以下:

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"] 中。很确定我很接近,但无法完成。

【问题讨论】:

    标签: mysql datetime compare schedule dateadd


    【解决方案1】:

    编写查询的正确方法是:

    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 更容易理解。它阐明了查询在做什么。 &gt;&lt; 基本上实现了相同的逻辑(好吧,两端都有一秒钟的差异,但我猜这并不重要)。

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

    【讨论】:

    • 是的,我在发送该问题后就注意到第二个 WHERE,但感谢您的建议,它会有所帮助。
    【解决方案2】:

    除了拼写错误的 sql 语句外,您应该比较的是用户输入,而不是表中的字段。这应该返回 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多