2017-06-03 182 views
1

我有一张表,其中包含有关他们一整天都在做什么的信息。我需要获得每个任务的开始时间/结束时间。将时间列拆分为开始时间/结束时间列

目前我能够拉每个任务的时间戳,但我希望创建开始时间和结束时间列。开始时间将是前一行的时间戳,结束时间将是当前行的时间戳。

有没有简单的方法来做到这一点?这是我目前使用的查询。

select 
Timestamp, 
Sku, 
Station, 
Username, 
ActionType 
from OverallLogs 


where 
and ActionType = 'Put' 
and Username = 'Name' 
and timestamp < DateAdd(Day, DateDiff(Day, 0, GetDate())+1, 0) 
AND timestamp >= DateAdd(Day, DateDiff(Day, 0, GetDate()), 0) 

Order by timestamp desc 
+0

什么版本的SQL Server? – RBarryYoung

回答

0

您可能需要使用SQL CTE选项,查找该链接上一些帮助,SQL Find difference between previous and current row

我的建议是保持单条记录的活动,如果你的第一个记录是开始,接下来是结束那个任务。

如果您不想更改模式,则可以添加一个描述任务类型列的列,它是开始或结束。它将在未来的查询中帮助你。

+0

谢谢,cte选项正是我所需要的。 –

0

如果您想获取最后一行的值,可以使用LAG功能。 例

;WITH sampledata(ID, t) AS(
    SELECT 1 ,DATEADD(HOUR,-12,GETDATE()) UNION 
    SELECT 2 ,DATEADD(HOUR,-8,GETDATE()) UNION 
    SELECT 3 ,DATEADD(HOUR,-4,GETDATE()) UNION 
    SELECT 4 ,DATEADD(HOUR,-2,GETDATE()) UNION 
    SELECT 5 ,DATEADD(HOUR,-1,GETDATE()) 

) 
SELECT *,LAG(t)OVER(ORDER BY t) AS start_t FROM sampledata 
 
ID   t      start_t 
----------- ----------------------- ----------------------- 
1   2017-06-03 06:48:59.447 NULL 
2   2017-06-03 10:48:59.447 2017-06-03 06:48:59.447 
3   2017-06-03 14:48:59.447 2017-06-03 10:48:59.447 
4   2017-06-03 16:48:59.447 2017-06-03 14:48:59.447 
5   2017-06-03 17:48:59.447 2017-06-03 16:48:59.447 
相关问题