首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Server中查找两个记录之间的时间差

如何在Server中查找两个记录之间的时间差
EN

Stack Overflow用户
提问于 2016-10-18 04:50:51
回答 2查看 156关注 0票数 1

我编写了一个查询,连接多个表,并寻找帮助查找2行相同标识符之间的时间差。

示例:Row num是我添加的另一列,以更好地解释

代码语言:javascript
复制
Row num     NodeID  Caption     VolumeID    Caption     DateTime
1.          2245    SERVERNAME  6545        D:\RAID     10/10/16 10:25 PM
2.          2245    SERVERNAME  6545        D:\RAID     10/10/16 10:10 PM
3.          2245    SERVERNAME  6545        D:\RAID     10/10/16 9:55 PM
4.          2245    SERVERNAME  6545        D:\RAID     10/10/16 9:40 PM
5.          2245    SERVERNAME  6545        D:\RAID     10/10/16 9:25 PM
6.          2245    SERVERNAME  6545        D:\RAID     10/10/16 9:25 PM
7.          2245    SERVERNAME  7710        D:\AFS\G    10/10/16 10:25 PM
8.          2245    SERVERNAME  7710        D:\AFS\G    10/10/16 10:10 PM
9.          2245    SERVERNAME  7710        D:\AFS\G    10/10/16 9:55 PM
10.         2245    SERVERNAME  7710        D:\AFS\G    10/10/16 9:40 PM
11.         2245    SERVERNAME  7710        D:\AFS\G    10/10/16 9:25 PM
12.         2245    SERVERNAME  7711        D:\AFS\G    10/10/16 10:25 PM
13.         2245    SERVERNAME  7711        D:\AFS\G    10/10/16 10:10 PM
14.         2245    SERVERNAME  7711        D:\AFS\G    10/10/16 9:55 PM
15.         2245    SERVERNAME  7711        D:\AFS\G    10/10/16 9:40 PM
16.         2245    SERVERNAME  7711        D:\AFS\G    10/10/16 9:25 PM
17.         2245    SERVERNAME  7712        D:\AFS\C    10/10/16 10:25 PM
18.         2245    SERVERNAME  7712        D:\AFS\C    10/10/16 10:10 PM
19.         2245    SERVERNAME  7712        D:\AFS\C    10/10/16 9:55 PM
20.         2245    SERVERNAME  7712        D:\AFS\C    10/10/16 9:40 PM
21.         2245    SERVERNAME  7712        D:\AFS\C    10/10/16 9:25 PM
22.         2245    SERVERNAME  7713        D:\AFS\C    10/10/16 10:25 PM
23.         2245    SERVERNAME  7713        D:\AFS\C    10/10/16 10:10 PM
24.         2245    SERVERNAME  7713        D:\AFS\C    10/10/16 9:55 PM
25.         2245    SERVERNAME  7713        D:\AFS\C    10/10/16 9:25 PM
26.         2245    SERVERNAME  7713        D:\AFS\C    10/10/16 9:40 PM

在上面的数据示例中,标识符是Nodeid和volumeid。

无论何时标识符匹配,都应该比较具有最新时间戳的记录和之前的记录,以确定差异。

在上面的示例中,查询应该能够只匹配nodeid 2245和volumeid 6545的第1行和第2行,输出应该是15分钟。

同样,对于nodeid 2245和volumeid 7710,应使用第7行和第8行进行计算。

我该怎么做?我尝试使用与CTE表达式,但无法做到。我也尝试了子查询,但失败了。

有人能帮我写这个查询吗。

我试过的查询:

代码语言:javascript
复制
WITH rows AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY [Operations-Orion].[dbo].[VolumeUsage].Datetime) AS rn
    FROM [Operations-Orion].[dbo].[VolumeUsage]
)
SELECT  DATEDIFF(second, mc.DateTime, mp.Datetime)
FROM    [Operations-Orion].[dbo].[VolumeUsage] mc
JOIN    [Operations-Orion].[dbo].[VolumeUsage] mp
ON      mc.rn = mp.rn

这会引发一个错误:

Msg 207,第16级,状态1,第10行 无效列名'rn‘。 Msg 207,第16级,状态1,第10行 无效列名'rn‘。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-18 05:44:07

使用下面的脚本。

代码语言:javascript
复制
;WITH  cte_1
as
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY NodeID,VolumeID ORDER BY [Datetime] desc) AS rn
    FROM #t
)
SELECT A.NodeID,A.Caption,A.VolumeID,A.Caption1,A.[DateTime]
,CASE DATEDIFF(HOUR, B.[DateTime], A.[DateTime])
                    WHEN 0 THEN CAST(DATEDIFF(MINUTE, B.[DateTime], A.[DateTime]) AS VARCHAR(10))
                    ELSE CAST(60 - DATEPART(MINUTE, B.[DateTime]) AS VARCHAR(10)) +
                        REPLICATE(',60', DATEDIFF(HOUR, B.[DateTime], A.[DateTime]) - 1) + 
                        + ',' + CAST(DATEPART(MINUTE, A.[DateTime]) AS VARCHAR(10)) 
                END TimeDifference
FROM cte_1 A
 join cte_1 B
  on A.rn=b.rn-1
   AND A.NodeID=B.NodeID AND A.VolumeID=B.VolumeID
WHERE B.rn=2 --if you dont want to limit ,comment this line

示例输出:

如果希望显示所有行,但只需要前两行的时间差,则添加一个额外的case语句,如下所示。

代码语言:javascript
复制
;WITH  cte_1
as
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY NodeID,VolumeID ORDER BY [Datetime] desc) AS rn
    FROM #t
)
SELECT A.NodeID,A.Caption,A.VolumeID,A.Caption1,A.[DateTime]
,CASE WHEN b.rn=2 THEN CASE DATEDIFF(HOUR, B.[DateTime], A.[DateTime])
                    WHEN 0 THEN CAST(DATEDIFF(MINUTE, B.[DateTime], A.[DateTime]) AS VARCHAR(10))
                    ELSE CAST(60 - DATEPART(MINUTE, B.[DateTime]) AS VARCHAR(10)) +
                        REPLICATE(',60', DATEDIFF(HOUR, B.[DateTime], A.[DateTime]) - 1) + 
                        + ',' + CAST(DATEPART(MINUTE, A.[DateTime]) AS VARCHAR(10)) 
                END ELSE NULL END TimeDifference
FROM cte_1 A
 join cte_1 B
  on A.rn=b.rn-1
   AND A.NodeID=B.NodeID AND A.VolumeID=B.VolumeID

示例输出:

票数 0
EN

Stack Overflow用户

发布于 2016-10-18 05:32:10

您必须在查询中使用cte而不是主表:

代码语言:javascript
复制
WITH CTEViewName AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY [Operations-Orion].[dbo].[VolumeUsage].Datetime) AS rn
    FROM [Operations-Orion].[dbo].[VolumeUsage]
)
SELECT  DATEDIFF(second, mc.DateTime, mp.Datetime)
FROM    CTEViewName mc
JOIN    CTEViewName mp
ON      mc.rn = mp.rn + 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40099761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档