2017-04-06 73 views
2

现在我有一个基于特定条件的总时间问题。例如,我有这样的事情。总和时间与特定分隔符

enter image description here

由于某些原因,我不得不添加基于他们的活动日的工作时间,如果只在活动日期审批状态为审批。

所以对于限制的例子,我有这样的事情

----------------------------------------------- 
| Activity Date | ApprovalStatus | WorkTime | 
----------------------------------------------- 
| 2017-01-06  | Rejected  | 01:00:00 | 
----------------------------------------------- 
| 2017-01-06  | Approve  | 03:00:00 | 
----------------------------------------------- 
| 2017-01-06  | Waiting  | 02:00:00 | 
----------------------------------------------- 
| 2017-01-06  | Approve  | 01:00:00 | 
----------------------------------------------- 

从这些例子中,接受工作时间,只有将从此情况进行汇总,因此,预期的结果是成为像下面。预期结果将变为04:00:00,因为只有最终结果才会被批准。

----------------------------------------------- 
| Activity Date | ApprovalStatus | WorkTime | 
----------------------------------------------- 
| 2017-01-06  | Approved  | 04:00:00 | 
----------------------------------------------- 

有没有什么启发来解决这个问题? PS:我正在使用SQL Server 2014.希望你能帮助我,谢谢!

+0

总结只批准同一日期的状态记录? –

+0

是@Jibin Balachadran,在同一天:) –

+0

什么是WorkTime的数据类型? –

回答

2

尝试像下面

模式:

SELECT * INTO #TAB FROM( 
SELECT '2017-01-06' AS Activity_Date 
, 'Rejected' AS ApprovalStatus 
, '01:00:00' AS WorkTime 
UNION ALL 
SELECT '2017-01-06' , 'Approve' , '03:00:00' 
UNION ALL 
SELECT '2017-01-06' , 'Waiting' , '02:00:00' 
UNION ALL 
SELECT '2017-01-06' , 'Approve' , '01:00:00' 
)A 

现在通过分组日期

SELECT [Activity_Date] 
,CAST(DATEADD(HH,SUM(DATEDIFF(HH,'00:00:00',WorkTime)),'00:00:00') AS TIME(0)) 
FROM #TAB 
WHERE ApprovalStatus='Approve' 
GROUP BY [Activity_Date] 

结果总结小时数列0

+---------------+------------------+ 
| Activity_Date | (No column name) | 
+---------------+------------------+ 
| 2017-01-06 | 04:00:00   | 
+---------------+------------------+ 

UPDATE:

SUM函数只需要精确数值或近似数字数据类型。它不会接受日期或时间数据类型进行求和。

它被记录在SUM (Transact-SQL)微软网站上。

SUM([ALL | DISTINCT]表达式)

表达

是常量,列,或功能,和 算术,位和字符串运算的任意组合。表达式是的表达式 的精确数字或近似数值数据类型类别,除了位数据类型为 。聚合函数和子查询不允许使用 。

所以你只能有机会写自己的逻辑来获得时间总和。这下面将计算时间的总和达几毫秒。

SELECT [Activity_Date] 
,CAST(DATEADD(ms, SUM(DATEDIFF(ms, '00:00:00.000', WorkTime)), '00:00:00.000') as time(0)) 
FROM #TAB2 
WHERE ApprovalStatus='Approve' 
GROUP BY [Activity_Date] 
+0

,这几乎是正确的。但是,我不知道为什么它不能像04:00 + 03:30那样处理,应该是07:30,但是您示例的结果是07:00。 –

+0

现在检查我的信息更新。更新后的查询也适用于分钟和秒钟。 :) @FarisFajar –

1

您可以通过ApprovalStatus过滤记录,并根据活动日期对工作时间进行汇总。

如果您只想添加小时部分,请使用此选项。

SELECT SUM(DATEDIFF(HH,'00:00:00',WorkTime)) AS [TotalWorktime] 
FROM [YourTable] 
WHERE ApprovalStatus = 'Approve' 
GROUP BY [Activity Date] 

OR

这个,如果你想添加甚至分钟部分使用。

SELECT SUM(DATEDIFF(MINUTE,'0:00:00',CONVERT(TIME,WorkTime)))/60 + (SUM(DATEDIFF(MINUTE,'0:00:00',CONVERT(TIME,WorkTime)))%60)/100.0 AS [TotalWorktime] 
FROM [YourTable] 
WHERE ApprovalStatus = 'Approve' 
GROUP BY [Activity Date] 
+0

操作数数据类型时间对求和算子无效,我不知道为什么? –

+0

回报是像600,400,480 :) –

+0

从你的第一个答案,我说得对。如果总和如03:00 + 04:30,则返回07:00。我不知道为什么? –