将时间列拆分为开始时间/结束时间列

时间:2017-06-03 19:04:36

标签: sql sql-server tsql sql-server-2016

我有一张表格,其中包含有关他们一整天所做的事情的信息。我需要获得每项任务的开始时间/结束时间。

目前我能够提取每项任务的时间戳,但我希望创建“开始时间”和“结束时间”列。开始时间是前一行的时间戳,结束时间是当前行的时间戳。

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

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

2 个答案:

答案 0 :(得分:0)

你可能想使用sql cte选项,在链接上寻求一些帮助,SQL Find difference between previous and current row

我的建议是保留活动的单一记录,如果您的第一条记录是开始,接下来是该任务的结束。

如果您不想更改架构,则可以再添加一列描述任务类型列的列,它是开始或结束。它将来会帮助您进行查询。

答案 1 :(得分: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