MySQL选择DATETIME类似于分钟

时间:2011-10-28 11:21:58

标签: mysql datetime multiple-tables

我必须相对于两个表之间的相同时间来对结果进行篡改,但由于它们的记录方式,时间戳会有所不同。 我想获得像示例1 中的结果,但我只获得带星号的值,如示例2 。 从比较中删除secods或选择与最接近的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

LLL 示例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

3 个答案:

答案 0 :(得分:12)

此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()从另一个时间戳中减去一个时间戳。不过要小心。此功能仅在几秒内彼此几天内的时间戳正确工作;它毫无顾忌地溢出(正如我发现的那样痛苦)。

您可以尝试在插入时将时间戳截断为分钟。那会让你为它们编制索引。

答案 1 :(得分:1)

WHERE ...
AND ABS(UNIX_TIMESTAMP(TimeStamp1) - UNIX_TIMESTAMP(TimeStamp2)) < :threshold:

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

答案 2 :(得分:1)

您可以使用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年。所以也许这个问题已得到解决。