【问题标题】:Splitting time column into start time / end time columns将时间列拆分为开始时间/结束时间列
【发布时间】:2017-11-04 23:12:07
【问题描述】:

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

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

有什么简单的方法可以做到这一点吗?这是我当前使用的查询。

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

【问题讨论】:

  • 什么版本的sql server?

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


【解决方案1】:

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

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

如果您不想更改架构,则可以再添加一列来描述作为开始或结束的任务类型列。它将在以后的查询中为您提供帮助。

【讨论】:

  • 谢谢,cte 选项正是我所需要的。
【解决方案2】:

如果要获取最后一行的值,可以使用 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 空 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多