查找日期列表之间的最大时间间隔

时间:2010-03-09 15:01:02

标签: mysql datetime

我有一个项目表,每个项目都有一个时间戳连接到它。我想找到任何一对连续项之间的最大间隔。这只能通过查询来实现吗?


更新:让我看看我是否可以减少这一点。我想要做的是将每个项目的时间戳与它之前和之后的项目进行比较,以找出两次之间经过了多少时间。我想为所有项目做到这一点,最后两个项目之间的差异最大。

我不想要任何两个项目之间的最大差异,因为这显然是第一个也是最后一个项目。希望描述更清楚。


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

我将尝试用一些数据描述问题......

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

所以对于上面的项目,我想要60秒(在第1项和第3项之间),但马丁(伟大的)答案将返回90秒(第1项和第2项)

3 个答案:

答案 0 :(得分: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;

这是一个自连接,其中一行与下一行连接。 diff值以降序值(最大的第一个)打印,只输出第一行。

编辑:鉴于问题的澄清,这是一次微弱的尝试来挽救我的解决方案。

创建一个包含条目datetime顺序的临时表,分配一个表示排名的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;

显然,如果您的项目表很大,这可能有点奢侈。

答案 1 :(得分:2)

这会有用吗?

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

答案 2 :(得分: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。

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

然后,我们计算从查询返回的时间和上一次之间的时间跨度。我们通过将整个内容包装在另一个查询中来完成此操作。这是上面的第一个SELECT。所以现在我们有任何我们想要的列加上之前的时间和它们之间的时间跨度。所以我们只是按照时间长度对行进行排序,然后选择第一个,我们就完成了!