现在我根据具体情况遇到了总和时间问题。例如,我有类似的东西。
由于某种原因,如果只批准活动日期的审批状态,我必须根据活动日期添加工作时间。
因此,对于限制示例,我有类似的内容
-----------------------------------------------
| 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 :(得分: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]