【问题标题】:Find the biggest Timespan without Data in Database查找数据库中没有数据的最大时间跨度
【发布时间】:2012-09-08 20:54:47
【问题描述】:

我有一个包含事件的数据库。每个事件都有一个时间戳。事件在白天均匀分布,但每天晚上都有一个没有数据的时间跨度。我的问题是夜晚的定义不明确。可以是从晚上 23 点到第二天早上 7 点,也可以是从早上 2 点到第二天早上 10 点,甚至是从晚上 8 点到第二天晚上 23 点。

现在我想计算事件的间隔,但没有没有事件的大时间跨度。但我不知道如何找到这个时间跨度。我的问题是,可能有几天没有时间跨度,或者有两天时间跨度相同(例如第一天晚上 8 点到午夜,第二天午夜到早上 7 点)。

我现在的问题是:如何找到这个时间跨度?

我更喜欢仅在 MySql 中的解决方案,但如果不可能,也可以使用 PHP。

【问题讨论】:

  • 如何找到一天中没有事件的最大时间跨度,然后将所有“空洞”(事件之间的时间)与之比较 - 只要它们小于或等于,那么它就是同一天。如果更大 - 新的一天已经开始......?
  • 这个问题:一天可能有相关的漏洞,早上一个,晚上一个,并且必须与前一天/第二天一起添加。而且我什至不知道如何打洞;-)
  • 只是一个粗略的idea,简单选择n和n-1的时间戳,得到时间戳的差异。然后按此差异排序。应该会给你想要的结果。
  • 我所说的“空洞”是什么意思:)

标签: php mysql algorithm information-retrieval


【解决方案1】:

如何将一个表自连接到下一行,然后在连接的表之间进行时间差异,并找到最大差异?

假设您的架构是这样的(并假设条目按时间顺序排列):

CREATE TABLE log (
  id INT NOT NULL AUTO_INCREMENT,
  occurred_at DATETIME,
  event VARCHAR(255),
  PRIMARY KEY (id),
  INDEX (occurred_at)
);

类似这样的:

SELECT 
  TIMEDIFF(after.occurred_at, before.occurred_at) AS time_gap,
  `before`.*, 
  `after`.*
FROM 
  log `before` JOIN 
  log `after` ON after.id = before.id+1 
ORDER BY time_gap DESC LIMIT 1;

【讨论】:

    【解决方案2】:

    您为什么不直接处理排序的事件列表,然后寻找每天最大的差距?

    在排序列表中查找间隙是微不足道的。定义一些阈值,例如“最少 1 小时”和“与 12-6 间隔重叠”,然后您就有了完整的间隙检测。

    顺便说一句,这并不是真正的“数据挖掘”。 - 这只是一个非常简单的数据查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多