2010-03-09 99 views
0

我有一个项目表,每个项目都有一个时间戳连接到它。我想找到任何一对连续项目之间的最大间隔。这只能用于查询吗?查找日期列表中最大的时间间隔


更新:让我看看是否可以使这一点更容易混淆。我想要做的就是比较每个项目的时间戳和它之前和之后的项目,以了解这两次之间经过了多少时间。我想为所有项目做到这一点,最后两项之间的差距最大。

我不想要任何两个项目之间的最大区别,因为那显然是第一个和最后一个项目。希望这个描述更清晰。


更新2:接受答案后很快,我意识到我再次错误地描述了这个问题。新问题是项目ID与时间戳的顺序不同。

我要去尝试了一些数据来说明问题......

 
Item - Time (seconds) 
Item0 - 000 
Item1 - 030 
Item2 - 120 
Item3 - 090 
Item4 - 100 

因此,对于以上项目,我想60秒(物品1和3之间),但马丁的(大)会回答返回90秒(item1和2)

+2

我认为你需要澄清你的问题。如果我以某种方式阅读它,听起来像是需要找出两个日期的差异 - 这只是减法。也许你想在一组日期中找到MAX和MIN日期? – jcollum 2010-03-09 15:05:17

回答

2

这项工作?

select max(timestamp_field)-min(timestamp_field) from my_table; 
+0

我已经更新了我的问题,以便更清楚一点。这不是我正在寻找的,但谢谢。 – UmYeah 2010-03-09 15:28:36

3

假设表所示:

create table item (i int not null primary key, 
        t datetime not null); 

select i1.i, i2.i, 
     abs(unix_timestamp(i1.t) - unix_timestamp(i2.t)) diff 
from item i1 
join item i2 on i1.i+1 = i2.i 
order by diff desc 
limit 1; 

这是自连接,其中一个行与下一行加入。差值按降序输出(最大值),只输出第一行。

编辑:这是一个微弱的尝试打捞我的解决方案给予澄清的问题。

创建条目的日期时间顺序,分配代表排名的AUTO_INCREMENT值的临时表,然后应用自联接到临时表:

create temporary table ranked_item (rank int not null auto_increment primary key, 
        i int not null, 
        t datetime not null); 

insert into ranked_item 
     select null, i, t from item order by t asc; 

select i1.rank, i2.rank, i1.i, i2.i, 
     abs(unix_timestamp(i1.t) - unix_timestamp(i2.t)) diff 
from ranked_item i1 
join ranked_item i2 on i1.rank+1 = i2.rank 
order by diff desc 
limit 1; 

显然,如果你的项目表是巨大的,这可能有点奢侈。

0

由于您未在问题中列出任何表名,因此我编制了times_logged_in.log_in以查找解决方案。另外,我没有安装MySQL,所以我在MS SQL Server中试过,但它应该非常接近。

select top 1 
    tli2.log_in as log_in, 
    tli2.previous as previous, 
    tli2.log_in - tli2.previous as time_span 
from 
    (
     select 
      tli.log_in as log_in, 
       (select max(log_in) from times_logged_in p where p.log_in < tli.log_in) as previous 
     from 
      times_logged_in tli 
    ) tli2 
order by time_span desc 

只是为了澄清,这是做如下:

首先,我们选择所有的时间(和我们希望在输出任何其他列,如ID或其他)。这是上面的第二个SELECT。

然后我们为前一次添加一列。这是通过使用相关的子查询找到的。这是上面的第三个选择。

然后,我们计算从我们的查询返回的时间与前一次之间的时间跨度。我们通过在另一个查询中包装整个事情来做到这一点。这是上面的第一个选择。所以现在我们有我们想要的任何列,再加上之前的时间和它们之间的时间跨度。所以我们只是按照时间长度排序,然后拿第一个,我们就完成了!