如何计算总计时间间隔(以天,小时或分钟为单位)

时间:2019-12-30 00:03:52

标签: sql sql-server tsql aggregate lag

我想比较按用户和列出的项目划分的组中每个项目状态更改的时间间隔(期间合计为总天数或小时数或分钟数)。 简要地说,问题是如何获取特定组的项目状态更改时的时间间隔。

我希望输出中包括每个项目状态更改在一个组中汇总的总时间(以小时和分钟为单位),以及该组中每个状态更改要比较的最大和最小时间间隔。

The required output

以下是示例数据:

ItemName项目ID ItemListID ItemStatus用户日期 项目1 102 N 2010 33状态2 A 2/20/2010 16:51     项目1 102 N 2010 33状态1 A 2/20/2010 16:59     项目1 102 N 2010 34状态B 3/7/2010 19:24     item1 102 N 2010 35状态C 3/12/2010 13:46     项目1102 N 2010 36状态3 D 3/26/2010 13:18     项目1102 N 2010 36状态2 D 3/30/2010 15:33     项目1102 N 2018 36状态1 D 4/28/2010 20:21     item2 109 NN 2010 129状态3 E 8/28/2010 18:40     item2 109 NN 2010 129状态2 E 8/28/2010 18:48     item2 109 NN 2010 129状态1 E 8/28/2010 19:50     Item3 104 MM 2010 11状态C 4/30/2010 14:13     项目3 104 MM 2010 1状态2 F 4/24/2010 10:53     项目3 104 MM 2010 1状态1 F 5/26/2010 13:24     项目3 104 MM 2010 10状态3 G 5/31/2010 11:52     项目3 104 MM 2010 10状态2 G 5/31/2010 15:52     项目3 104毫米2010年10空G 5/31/2010 16:40     项目3 104 MM 2010 11状态H 5/31/2010 18:16     项目3 104 MM 2010 14状态3 J 4/4/2010 17:13     项目3 104 MM 2010 14状态2 J 5/10/2010 15:15     项目3 104 MM 2010 14状态1 J 5/31/2010 11:16     item4 105 QQ 2010 88空K 6/4/2010 16:13     item4 105 QQ 2010 88空K 6/11/2010 17:15     item4 105 QQ 2010 88状态1 K 10/4/2010 18:16

这是我尝试过的SQL代码:

**Select y.itemname,y.itemid,y.itemlistid, y.itemstatus
 ,y.user,y.date ,y.rank,y.lagg,y.leadd

,Case When datediff(YEAR,y.leadd,y.date) is not null
     Then DATEPART(YEAR, y.date-y.lead )-1900)
     Else 0
     End as Yeardiff

,Case When datediff(Month,y.leadd,y.date) is not null
     Then DATEPART(Month, y.date-y.lead )-1)
     Else 0
     End as Monthdiff
,Case When datediff(Day,y.leadd,y.date) is not null
     Then DATEPART(Day, y.date-y.lead )-1)
     Else 0
     End as Daydiff
,Case When datediff(Hour,y.leadd,y.date) is not null
     Then DATEPART(Hour, y.date-y.lead )
     Else 0
     End as Hourdiff

,Case When datediff(Minute,y.leadd,y.date) is not null
     Then DATEPART(Minute, y.date-y.lead )
     Else 0
     End as Minutediff


from [dbo].[VW_ProcessInterval] AS VWP

Inner Join
(
Select Itemid,itemname,itemstatus,itemlistid,user,date
,DENSE_RANK() over (Partition by user,itemlistid Order by date Desc) AS rank
,convert(datetime, lag(Date,1) over(Partition by itemlistid,user Order by date Desc) ) as lagg
,convert(datetime, lead(Date,1) over(Partition by itemlistid,user Order by date Desc) ) as leadd
from [dbo].[VW_ProcessInterval]  
group by Itemid,itemname,itemstatus,itemlistid,user,date 
) as Y

ON
y.itemid=vwp.itemid and 
y.itemname=vwp.itmname and 
y.itemstatus=vwp.itemstatus and 
y.itemlistid=vwp.itemlistid and 
y.user=vwp.user and 
y.date=vwp.date 

Order by user,itemlistid**

0 个答案:

没有答案