Sql 使用特定分隔符求和时间

Sql 使用特定分隔符求和时间,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,现在我有一个基于特定条件的求和时间的问题。例如,我有这样的东西 由于某些原因,如果活动日期上的审批状态仅为“批准”,我必须根据其活动日期添加工作时间 所以对于限制的例子,我有这样的东西 ----------------------------------------------- | Activity Date | ApprovalStatus | WorkTime | ----------------------------------------------- | 2017-01-06

现在我有一个基于特定条件的求和时间的问题。例如,我有这样的东西

由于某些原因,如果活动日期上的审批状态仅为“批准”,我必须根据其活动日期添加工作时间

所以对于限制的例子,我有这样的东西

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

您可以按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]
试试下面这样

模式:

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         |
+---------------+------------------+
更新:

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
SUM
函数将仅采用精确数字或近似数字数据类型。它不接受求和的日期或时间数据类型

它记录在microsoft网站的中

总和([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]

只批准同一日期的状态记录的总和??是@Jibin Balachadran,在同一日期:)工作时间的数据类型是什么?它是时间类型:),操作数数据类型时间对求和运算符无效,我不知道为什么?返回值类似于600400480:)从您的第一个答案中,我得到了正确的答案。然而,当总和为03:00+04:30时,它返回07:00。我不知道为什么?@FarisFajar如果你必须添加分钟部分,那么使用第二个查询。从你的答案来看,这几乎是正确的。然而,我不知道为什么它不能处理像04:00+03:30应该是07:30,但从你的例子的结果是07:00。现在检查我的信息更新。更新后的查询也可以工作几分钟和几秒钟。:)@法里斯法加