2011-12-28 47 views
2

我们在我们的数据库中有一个表格,各种系统报告时间戳和值。该表被称为数据表。 (我知道,我没有把它命名。)计算记录之间的日期差异

因此,我可以完成任务并查找特定系统报告之间的时间差异。

不知道怎么回事,去了解这一点,我创建了一个临时表,例如:

CREATE TABLE #Readings(
    id   INT IDENTITY(1,1) PRIMARY KEY NOT NULL, 
    timestamp  DATETIME 
) 

然后我插入所有读数的特定系统:

INSERT INTO #Readings (timestamp) 
SELECT ReadingAt 
FROM data 
WHERE SenId = 3 
ORDER BY ReadingAt 

最后,我运行我的查询:

select r1.id, r1.timestamp, datediff(second, r1.timestamp, (select r2.timestamp 
from #Readings r2 where r2.id = (r1.id - 1))) 
from #Readings r1 
where id > 1 

但这返回:

101 2011-07-14 04:44:05.443 <null> 
102 2011-07-14 04:46:05.443 -120 
103 2011-07-14 04:48:05.447 -120 
104 2011-07-14 04:50:05.447 -120 
105 2011-07-14 04:52:05.447 -120 
106 2011-07-14 04:54:05.45 -120 
107 2011-07-14 04:56:05.45 -120 
108 2011-07-14 04:58:05.45 -120 
109 2011-07-14 05:00:05.45 -120 
110 2011-07-14 05:02:05.453 -120 

所以我做了以下内容:

select r1.id, r1.timestamp, (select r2.timestamp from #Readings r2 where r2.id = (r1.id - 1)) 
from #Readings r1 
where id > 1 

其返回正确的日期。

所以,我想知道,我该怎么做?

谢谢。

+1

你得到的结果看起来合理的,我 - 如果你想正值,只是改变了第二顺序和第三个操作数。你期望得到什么? – 2011-12-28 20:39:35

+0

无论时间范围如何,结果总是120秒。这就是为什么他们不合理。 – Thom 2011-12-28 20:43:05

+1

这其实是正确的答案。哎呦。感谢您指出。 – Thom 2011-12-28 20:44:27

回答

4

让自己变得更简单,不要使用子查询!

select 
    r1.id, 
    r1.timestamp, 
    datediff(second, r2.timestamp, r1.timestamp) as TimeBetween 
from 
    #Readings r1 
    left join #Readings r2 on 
     r1.id = r2.id+1 
where 
    r1.id > 1 

但是对于它的价值,第一个查询是正确的。您的datediff功能是开始时间和结束时间之间的时间。开始时间必须小于结束时间。这就是为什么你会得到消极的。

+0

我曾经想到过这一点,但由于某种原因,没有尝试过。当我现在尝试了,它返回: 2011-07-14 04:44:05.443 \t 2011-07-14 04:46:05.443 \t -120 2011-07-14 04 :48:05.447 \t -120 2011-07-14 04:50:05。447 -120 2011-07-14 \t 04:52:05.447 \t -120 2011-07-14 04:54:05.45 \t -120 2011-07-14 04:56:05.45 \t -120 2011-07-14 04:58:05.45 \t -120 2011-07-14 05:00:05.45 \t -120 2011-07-14 05:02:05.453 \t -120 2011-07-14 05:04:05.453 \t -120 2011-07-14 05:06:05.457 \t -120 2011-07-14 05:08:05.507 \t -120 2011-07-14 05:10:05.51 \t -120 – Thom 2011-12-28 20:41:57

+0

@Thom - 这是更好用'JOIN'做到这一点,但问题与'DATEDIFF'上的列顺序有关,它应该是相反的。由于您示例数据中的每条记录相距2分钟,因此结果为-120秒 – Lamak 2011-12-28 20:43:54

+0

噢,并且+1回答您的答案 – Lamak 2011-12-28 20:44:08

0

这里是你如何能做到这一切在一个查询,没有任何临时表

SELECT T1.ReadingAt, T2.ReadingAt, 
     datediff(second, T2.ReadingAt, T1.ReadingAt) AS TimeBetween 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY ReadingAt) AS RowNumber, ReadingAt 
     FROM data 
     WHERE SenId = 3) t1 
     INNER JOIN 
     (SELECT ROW_NUMBER() OVER (ORDER BY ReadingAt) AS RowNumber, ReadingAt 
     FROM data 
     WHERE SenId = 3) t2 ON T1.RowNumber = T2.RowNumber + 1