【问题标题】:MySQL select DATETIME similar up to the minuteMySQL 选择 DATETIME 类似到分钟
【发布时间】:2011-12-17 05:32:27
【问题描述】:

我必须比较两个表之间相对于同一时间的结果,但是由于记录方式的不同,时间戳会有所不同。 我想获得类似 示例 1 中的结果,但我只获得带有星号的值,如 示例 2 中所示。 从比较中删除秒数或选择与最接近的 DATETIME 值对应的值的最佳方法是什么?

目前我正在使用这个查询:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1, Table2 
    WHERE ... conditions for the other parameters of Table1 and Table2... 
    AND Table1.TimeSTamp1 = Table2.TimeStamp2

热烈欢迎任何关于最佳实践的建议。


示例 1

TimeStamp1          ¦   Param1  ¦   TimeStamp2          ¦   Param2
2011-01-01 00:00:35 ¦   1       ¦   2011-01-01 00:00:35 ¦   a       *
2011-01-01 00:01:35 ¦   2       ¦   2011-01-01 00:01:35 ¦   b
2011-01-01 00:02:37 ¦   3       ¦   2011-01-01 00:02:35 ¦   c
2011-01-01 00:03:31 ¦   4       ¦   2011-01-01 00:03:35 ¦   d
2011-01-01 00:04:32 ¦   5       ¦   2011-01-01 00:04:35 ¦   e
2011-01-01 00:05:38 ¦   6       ¦   2011-01-01 00:05:35 ¦   f
2011-01-01 00:06:36 ¦   7       ¦   2011-01-01 00:06:36 ¦   g       *
2011-01-01 00:07:32 ¦   8       ¦   2011-01-01 00:07:35 ¦   h
2011-01-01 00:08:33 ¦   9       ¦   2011-01-01 00:08:35 ¦   i
2011-01-01 00:09:33 ¦   10      ¦   2011-01-01 00:09:33 ¦   l       *
2011-01-01 00:10:35 ¦   11      ¦   2011-01-01 00:10:35 ¦   m       *
2011-01-01 00:11:29 ¦   12      ¦   2011-01-01 00:11:31 ¦   n

ll 示例 2

TimeStamp1          ¦   Param1  ¦   TimeStamp2          ¦   Param2
2011-01-01 00:00:35 ¦   1       ¦   2011-01-01 00:00:35 ¦   a
2011-01-01 00:06:36 ¦   7       ¦   2011-01-01 00:06:36 ¦   g
2011-01-01 00:09:33 ¦   10      ¦   2011-01-01 00:09:33 ¦   l
2011-01-01 00:10:35 ¦   11      ¦   2011-01-01 00:10:35 ¦   m

【问题讨论】:

    标签: mysql datetime multiple-tables


    【解决方案1】:

    这个 MySql 表达式将返回 DATETIME 值,秒数归零。

    CONVERT(DATE_FORMAT(table.column,'%Y-%m-%d-%H:%i:00'),DATETIME)
    

    看看这个。 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format 。所以你最终可能会得到这样的查询:

    SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
        FROM Table1
        JOIN Table2 ON  CONVERT(DATE_FORMAT(Table1.TimeStamp1,'%Y-%m-%d-%H:%i:00'),DATETIME)
                     =  CONVERT(DATE_FORMAT(Table2.TimeStamp2,'%Y-%m-%d-%H:%i:00'),DATETIME)
        WHERE ... conditions for the other parameters of Table1 and Table2... 
    

    但是,要小心。自动生成的时间戳有点像浮点数;当他们中的两个出现彼此相等时,这只是运气。将时间戳截断到分钟可能是可以的,但最好从另一个时间戳中减去一个时间戳,然后比较差异(或差异的绝对值)。

    另外,这个连接会很慢,因为它必须对每个值运行二次截断函数,所以它不能使用任何索引。

    您可以使用TIMESTAMPDIFF() 从另一个时间戳中减去一个时间戳。但小心点。此功能仅在几天内的时间戳秒级别上正常工作;它毫不优雅地溢出(正如我痛苦地发现的那样)。

    您可以尝试在插入时间戳时将它们截断为分钟。这样你就可以索引它们了。

    【讨论】:

    • 谢谢,TIMESTAMPDIFF 成功了。有时我会重复输入,删除它们需要很长时间。我会测试在这种情况下转换日期是否更快。
    【解决方案2】:
    WHERE ...
    AND ABS(UNIX_TIMESTAMP(TimeStamp1) - UNIX_TIMESTAMP(TimeStamp2)) < :threshold:
    

    其中threshold 是您不再需要匹配的秒数(例如 1 分钟为 60)。

    【讨论】:

      【解决方案3】:

      您可以使用TIMESTAMPDIFF 以秒为单位计算日期时间的差异:

      SELECT t1.TimeStamp1, t1.Param1, t2.TimeStamp2, t2.Param2
      FROM Table1 t1
      LEFT JOIN Table2 t2
      ON ABS(TIMESTAMPDIFF(SECOND,t1.TimeStamp1,t2.TimeStamp2))<=4
      WHERE ...
      

      注意Ollie Jones warning,我已经在 MySQL 5.1.58 版本上测试了 TIMESTAMPDIFF,发现时间戳相差至少 10000 年没有溢出。所以也许这个问题已经解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        相关资源
        最近更新 更多