【问题标题】:MySQl Query which with a time toleranceMySQl 查询哪个具有时间容差
【发布时间】:2017-02-15 21:48:45
【问题描述】:

嗨,我有一个这样的查询

SELECT
meteor_events.event_id AS event_id,
meteor_events.user_ID AS user_ID,
meteor_events.date AS date,
meteor_events.Time
from `meteor_events`

给定日期可能有多个事件,即

37775   2   2017-01-01  00:01:23
33500   1   2017-01-01  01:07:56
37776   2   2017-01-01  01:08:45
47827   3   2017-01-01  01:08:30
37777   2   2017-01-03  01:09:44

我想更新查询,以便它带回一条记录

1 - 日期匹配 和 2 - 时间匹配,但无论哪种方式都有 30 秒的容差

所以在这个例子中它会返回

37776   2   2017-01-01  01:08:45
47827   3   2017-01-01  01:08:30

我只是不确定要开始吗?

约翰·B

【问题讨论】:

标签: mysql date time


【解决方案1】:

如果将数据和时间列合并为一个,可能会更容易。还要避免使用 SQL 关键字作为列名

你需要一个自我加入来完成这个任务:

SELECT a.event_id, a.user_ID, a.`date`, a.`Time`
FROM meteor_events AS a
JOIN meteor_events AS b
WHERE a.event_id != b.event_id
AND a.`date` = b.`date`
AND time_to_sec(a.`Time`) - time_to_sec(b.`Time`) BETWEEN -30 AND 30;

【讨论】:

  • SIDU 运行良好,它很慢,所以我在日期和时间列中添加了一个索引,而不是速度不是问题 - 它需要稍微更新一下。例如,如果用户 3 在 + 或 - 30 秒内有 2 个匹配日期和 2 次,则这些结果也会返回,每个用户事件都是唯一的,用户 3 可能有几个事件仅相隔几秒钟,但它们是唯一事件,我只希望查询带回其他用户的匹配事件 - 希望这是有道理的?
  • 在这种情况下,添加:AND a.user_ID != b.user_ID
  • “同时避免使用 SQL 关键字作为列名” - 现在告诉我为什么?我有“`”字符。它不会让我的查询太长
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多