T-Sql多个DateDiff,多个开始和结束日期存储在同一个表中?

时间:2014-01-22 22:47:49

标签: sql sql-server tsql

我正在开发一个ERP系统,该系统具有适用于不同业务流程的多个工作流程。在这个系统中,我可以访问供应商提供的视图,而不是所有底层表。每次记录进入并完成其中一个工作流程步骤时,都会有一个记录和时间戳记的日志表。

我想要做的是编写一个查询,显示以天为单位的时间,一个小数,每个记录在每个步骤中花费的时间。

在视图中我可以访问没有主键 - 它看起来像这样:

Record_id  Workflow_id  Workflow_Step_id Start_Date            Result_Key Complete_Date
 Record 1    1422                1        20-Feb-07 9:16:35 PM   7320       23-Mar-07 2:16:10 PM
 Record 1    1422                2        23-Mar-07 2:16:10 PM   7320       23-Mar-08 3:13:30 PM
 Record 1    1422                3        23-Mar-08 3:13:30 PM   7320       23-Mar-10 8:18:10 AM
 Record 1    1422                4        23-Mar-10 8:18:10 AM   7320       23-Mar-13 4:06:57 PM

基本上Record_id是时间戳正在记录的记录,其中有数千个,并且它们不是唯一的,因为每次记录通过工作流程中的一个步骤时,它都会再次标记新记录。

Workflow_id就是记录所经历的工作流程(即采购订单,工程变更请求等) - 有多个工作流程,所以我需要过滤哪个工作流程用于最终结果

Workflow_Step_id让我知道这个时间戳正在反映的工作流程中的哪一步。

Result_Key是一种说“通过”或“被拒绝”的数字方式 - 在这种情况下,“7320”表示“通过”,这是我最感兴趣的(如果重要的话)。

Start_Date和Complete_Date是显而易见的,但这就是我正在尝试测量每个记录在整个工作流程中Workflow_Step_Id中每个步骤之间的时间。

理想情况下,这是我最终结果的样子,在适当的Workflow_id(1422)上过滤:

 Record_id  Step_1  Step_2  Step_3  Step_4 
  Record 1    30.0    1.0     10.4     3.2
  Record 2    10.1    8.2      7.3     4.8
  Record 3     2.1    4.1      8.4     6.1

(数学与我上面提供的数据不完全相同,这只是为了说明我希望最终结果看起来像什么。)

2 个答案:

答案 0 :(得分:1)

您可以使用PIVOT

执行此操作
;WITH cte AS (SELECT Record_ID, Workflow_Step_ID,CAST(DATEDIFF(hour,Start_Date,Complete_Date)*1.0/24 AS DECIMAL(19,1)) AS Day_Diff
              FROM Table1
              )
SELECT *
FROM cte
PIVOT(MAX(Day_DIFF) FOR WorkFlow_Step_ID IN ([1],[2],[3],[4]))pvt

演示:SQL Fiddle

更新:您可以在查询末尾使用WHERE子句根据已填充的[99]字段进行拆分(成为透视输出中的字段,即:

;WITH cte AS (SELECT Record_ID, Workflow_Step_ID,CAST(DATEDIFF(hour,Start_Date,Complete_Date)*1.0/24 AS DECIMAL(19,1)) AS Day_Diff
              FROM Table1
              )
SELECT *
FROM cte
PIVOT(MAX(Day_DIFF) FOR WorkFlow_Step_ID IN ([1],[2],[3],[4],[99]))pvt
WHERE [99] IS NULL -- Returns all that weren't terminated, or `IS NOT NULL` for those that are terminated.

演示:SQL Fiddle

答案 1 :(得分:0)

我认为你正在寻找一个数据透视表,就像这些一样

SELECT Record_id, [1] Step1, [2] Step2, [3] Step3, [4] Step4
FROM (
SELECT Record_id, Workflow_Step_id, cast((Datediff(s, Start_Date, Complete_Date) / 86400.0) as decimal(5, 1)) as DayCnt
FROM tablename t) up
PIVOT (Max(DayCnt) FOR Workflow_Step_id IN ([1], [2], [3], [4])) AS pvt