SQL中datetime列的差异

时间:2016-04-06 12:27:34

标签: sql datetime

我有一张20000条记录的表格。每个记录都有一个日期时间字段。我想选择一条记录和后续记录之间的差距超过一小时的所有记录[在日期时间字段上应用的条件]。

任何人都可以为此提供SQL命令代码。

问候

KAM

3 个答案:

答案 0 :(得分:4)

ANSI SQL支持lead()函数。但是,日期/时间功能因数据库而异。以下是您需要的逻辑,尽管确切的语法因数据库而异:

select t.*
from (select t.*,
             lead(datetimefield) over (order by datetimefield) as next_datetimefield
      from t
     ) t
where datetimefield + interval '1 hour' < next_datetimefield;

注意:在Teradata中,where将是:

where datetimefield + interval '1' hour < next_datetimefield;

答案 1 :(得分:2)

这也可以通过子查询来完成,该查询应该适用于所有 DBMS。正如戈登所说,日期/时间功能各不相同。

for(unsigned int i = 0; i < somemore.size(); i++)
{
   for(unsigned int j = 0; j < some.size(); j++)
      {
          std::cout << somemore[i][j] << std::endl;
      }
}

你可以替换它:

SELECT t.* FROM YourTable t
WHERE t.DateCol + interval '1 hour' < (SELECT min(s.DateCol) FROM YourTable s
                   WHERE t.ID = s.ID AND s.DateCol > t.DateCol)

使用其中之一,它几乎适用于所有DBMS:

t.DateCol + interval '1 hour'

答案 2 :(得分:2)

虽然Teradata不支持标准SQL的LEAD,但它很容易重写:

select tab.*,
   min(ts) over (order by ts rows between 1 following and 1 following) as next_ts
from tab
qualify 
   ts < next_ts - interval '1' hour 

如果您不需要显示下一个时间戳:

select *
from tab
qualify 
   ts < min(ts) over (order by ts rows between 1 following and 1 following) - interval '1' hour 

QUALIFY是一个Teradata扩展程序,但非常好,类似HAVING之后的GROUP BY