与特定分隔符

时间:2017-04-06 05:20:04

标签: sql sql-server sql-server-2014

现在我根据具体情况遇到了总和时间问题。例如,我有类似的东西。

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.希望你能帮助我,谢谢!!

2 个答案:

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

结果:

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

更新:

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]

答案 1 :(得分:1)

您可以通过ApprovalStatus过滤记录,并通过按活动日期对其进行分组来对工作时间进行总结。

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

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

如果您想要添加分钟部分,请使用此选项。

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]