需要帮助比较SQL DB中日期时间戳的区别

时间:2014-04-08 11:35:43

标签: sql-server sql-server-2008

我有一个记录用户活动的MSSQL server 2012 express DB。我需要一些帮助来创建一个查询,以根据笔记中的文本比较用户活动的时间戳。我有兴趣弄清楚我的用户执行某些活动需要多长时间。他们正在执行的活动存储在NOTES列中的文本中。我想构建一个查询,告诉我每个[INVOICEID]从“START NOTE”到该用户的该发票的下一个备注的时差。输入的音符对于定时器的开始始终是相同的(为了这个目的,我使用'开始注意'来指示定时器的开始,但我有多个活动,我需要这样做,所以我计划在简单地改变查询中的那个文本),但是在计时器结束时,注释的文本会有所不同,因为它将是用户输入的数据。我想找到'START NOTE'和同一INVIDICEID由同一USERID输入的'START NOTE'后面的注释之间的时差。有关我的数据的示例,请参阅SQLfiddle:

http://sqlfiddle.com/#!3/a00d7/1

使用sql中的数据小提琴我希望此查询的结果为:

INVOICE ID  USERID      TIME_Difference
100         5           1 day
101         5           3 days
102         5           9 days

(time_difference不需要像那样格式化,标准的SQL格式很好)

我真的不知道从哪里开始。如果你能提供帮助,请告诉我。 感谢

2 个答案:

答案 0 :(得分:1)

select a.userid,a.invoiceid,min(a.added),min(b.added),datediff(DAY,min(a.added),min(b.added)) from om_note a 
left join om_note b on a.userid=b.userid and a.invoiceid = b.invoiceid and a.added < b.added
where a.notes = 'START NOTE' group by a.userid,a.invoiceid

答案 1 :(得分:0)

;with x as (
    select 
        o.*, sum(case when notes='START NOTE' then 1 else 0 end) 
            over(partition by o.invoiceid, o.userid order by o.added) as grp
    from om_note o
),
y as (
    select *,
            row_number() over(partition by x.invoiceid, x.userid, x.grp order by x.added) as rn
    from x
    where grp > 0
)
select y1.invoiceid, y1.userid, datediff(hour, y1.added, y2.added) 
from y y1
inner join y y2
on y1.invoiceid=y2.invoiceid and y1.userid=y2.userid and y1.grp=y2.grp
where y1.rn=1 and y2.rn=2