在时间戳略有不同的2个不同数据库中的表之间连接(MySQL)

Posted

技术标签:

【中文标题】在时间戳略有不同的2个不同数据库中的表之间连接(MySQL)【英文标题】:Join between tables in 2 different databases with slight differences in timestamp (MySQL) 【发布时间】:2018-06-30 06:16:17 【问题描述】:

根据mysql -- join between tables in 2 different databases? 的建议,我使用以下格式从不同的 mysql 数据库中检索跨两个表共享列值的数据。

SELECT <...>
FROM A.table1 t1 JOIN B.table2 t2 ON t2.column2 = t1.column1;

我想从表中获取相同日期、小时和分钟的共享值。但是,我意识到,由于来自不同数据库的两个表的时间戳列中的时间戳值在记录的秒数方面略有不同 2018-01-21 23:30:052018-01-21 23:30:15,因此我无法检索任何公共数据。如何修改我的查询,以便我可以查询来自两个不同数据库的两个表之间关于时间戳值的公共数据,同时忽略时间戳列的“秒”部分?

【问题讨论】:

2018-01-21 23:29:592018-01-21 23:30:00 怎么样?差别只有一秒。 您尝试加入的列之一是否可能实际上与时间戳相关? @Paul:这是个好主意,但我已经编写了 python 脚本以在 0 或 30 分钟时记录 SQL 数据库中的值,因此不太可能遇到稍早的时间。我得到的以秒为单位的轻微延迟可能是因为我的脚本正在使用这些秒来接收来自传感器的数据。 【参考方案1】:

你可以使用

 ON t2.datestamp BETWEEN t1.datestamp - INTERVAL 2 SECOND
                     AND t1.datestamp + INTERVAK 2 SECOND

对于JOIN 操作中的ON 子句。这将为比赛提供 4 秒的窗口。

当然,如果你把窗口设置得太宽,你会得到一些你不想要的匹配,如果你把它设置得太窄,你会错过一些。

【讨论】:

感谢您的帮助并提及此方法的注意事项。我已将间隔增加到 10 秒,并检索了一些“共享”行。不过,我将再次查看表格,以防万一可能出现数据记录间隔超过 10 秒的情况,我可能会按照建议错过它们。 @Craver2000 - 间隔越宽,匹配不应该匹配的行的可能性就越大。 GIGO。【参考方案2】:

虽然我认为 O.Jones 的回答是解决您的问题的更好方法,但如果您确实需要比较两个时间戳“忽略“秒”部分”,您可以执行以下操作:

SELECT <...>
FROM A.table1 t1
JOIN B.table2 t2
  ON t2.column2 BETWEEN date_format(t1.column1, '%Y-%m-%d %H:%i:00')
                    AND date_format(t1.column1, '%Y-%m-%d %H:%i:59')

或更准确地说:

  ON  t2.column2 >= date_format(t1.column1, '%Y-%m-%d %H:%i:00')
  AND t2.column2 <  date_format(t1.column1, '%Y-%m-%d %H:%i:00') + interval 1 minute

  ON  t2.column2 >= t1.column1 - interval second(t1.column1) second
  AND t2.column2 <  t1.column1 - interval second(t1.column1) second + interval 1 minute

【讨论】:

以上是关于在时间戳略有不同的2个不同数据库中的表之间连接(MySQL)的主要内容,如果未能解决你的问题,请参考以下文章

在两个不同数据库中的表之间连接?

如何合并两个不同的数据帧,时间戳略有不同

查询 - 数据集中的全外连接2个不同的表 - LINQ C#

如何从 3 个不同的表中插入内连接

Mysqli 连接来自 2 个不同数据库的表

对时间戳略有差异的时间序列求和