【问题标题】:Find the time difference between rows查找行之间的时间差
【发布时间】:2012-12-04 09:06:36
【问题描述】:

我在表中有大约 30000 行,每 10 分钟有一次时间戳,大约有 20 列。

timestamp  Col1 Col2 Col3 ... col20

timestamp 每 10 分钟一次。例如:18-05-2012 20:0718-05-2012 20:1718-05-2012 20:27

列具有整数或浮点数据。

我的问题是:我需要找到数据未记录在列中的间隙和持续时间。假设列有Value、NULL、NULL、Value、Value、NULL。它有各自的时间戳。

我需要像 NULL 值和持续时间(开始时间 - 结束时间)的开始时间和结束时间这样的输出。

【问题讨论】:

  • timestamp列有什么数据类型??
  • 时间戳数据类型为日期时间(例如:18-05-2012 18:28)

标签: sql sql-server-2008


【解决方案1】:

好的,正如我现在所理解的那样,您想要在任何列中没有记录某些内容的行之间的时间差,对吗?

那就试试这个吧:

SELECT
yt1.[timestamp] AS StartTime,
MIN(yt2.[timestamp]) AS EndTime,
DATEDIFF(s, yt1.[timestamp], MIN(yt2.[timestamp])) AS DifferenceInSeconds
FROM
yourTable yt1
LEFT JOIN yt2 ON yt1.[timestamp] < yt2.[timestamp]
WHERE
yt1.Col1 IS NULL
OR yt1.Col2 IS NULL
...
OR yt1.Col20 IS NULL
OR yt2.Col1 IS NULL
...
OR yt2.Col20 IS NULL 
GROUP BY yt1.[timestamp]

老实说,我不确定这是否有效,因为您没有提供示例数据来玩一下。

在stackoverflow上获取hh:mm:ss格式的时差搜索问题,例如this one

【讨论】:

  • 感谢您的回复,但我也需要时间戳持续时间。例如,Col1 不包含所有 NULL 值,在某些地方它没有记录,如果我们根据您的回答进行查询,我只会得到时间戳和 Col Null 值,但我需要一个时间戳到第二个时间戳之间的持续时间,如果该值从 04-12-2012 2:00 到 04-12-2012 2:40 为空,我需要时差为 40 分钟,时间戳为空值的开始时间和结束时间。 Null 值是随机的,可以在任何行中。如果您不清楚,请告诉我。但真的很欣赏你的回应
  • 我尝试了查询,SELECT DATEDIFF(s, yt1.[timestamp], MAX(yt2.[timestamp]) AS DifferenceInSeconds FROM EcstasyAggregateSignals yt1 LEFT JOIN yt2 ON yt1.[timestamp] > yt2.[ timestamp] WHERE yt1.DBT IS NULL GROUP BY yt1.[timestamp] 但我收到错误消息 156, Level 15, State 1, Line 2 关键字'AS'附近的语法不正确。请帮助
  • @Reyaz 这是一个缺失的括号。已更正。
  • 谢谢!!查询已执行,但我没有得到预期的结果。我需要一些输出作为 StartTime|结束时间|作为列和数据的值持续时间应类似于 18-05-2012 18:28| 18-05-2012 18:48| 20 分钟......这里的时间戳列每 10 分钟递增一次......对不起,如果我让你感到困惑。请告诉我如何提供数据。
  • 你是天才..太好了..我完成了查询。干得好..如果我有任何问题会在这里发布..从现在开始我是stackoverflow的粉丝..
【解决方案2】:

我认为您应该使用 2 个左连接:检测 NULL 外观的开始,通常我的答案看起来很像以前的答案:

select distinct  max(table2.dt) as startTime, min(table3.dt) as endTime,  
datediff(minute, max(table2.dt), min(table3.dt)) as timeDifference
from Table_2 table1
left join Table_2 table2 on table2.dt < table1.dt 
left join Table_2 table3 on table3.dt > table1.dt
where (table3.tt1 is not NULL and table3.tt2 is not NULL)
  and (table2.tt1 is not NULL and table2.tt2 is not NULL)
  and (table1.tt1 is NULL or table1.tt2 is NULL)
  group by table1.dt, table1.id

【讨论】:

  • 感谢您的回复,我对table2、table3 感到困惑。如果表名是ship 并且列是DBT、LONG,我只有一张表。你能帮我重写查询吗?提前致谢
  • 和列名作为时间戳
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2014-08-05
  • 1970-01-01
相关资源
最近更新 更多