sql - 我怎样才能总结所有的加班时间
问题描述
我无法弄清楚如何从查询中总结所有持续时间。我必须使用另一个查询来总结它......
这是我为获取超时持续时间和其他持续时间所做的查询......
Select empId, firstTimeIn, firstTimeOut, secondTimeIn, secondTimeOut, overTimeIn, overTimeOut, attendanceDate,
(RIGHT('0' + CAST(DATEDIFF(second, Convert (time, firstTimeIn), Convert (time, firstTimeOut) ) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, firstTimeIn), Convert (time, firstTimeOut) ) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, firstTimeIn), Convert (time, firstTimeOut) ) % 3600 % 60 AS VARCHAR(2)), 2) ) as FirstTime
,
(RIGHT('0' + CAST(DATEDIFF(second, Convert (time, secondTimeIn), Convert (time, secondTimeOut) ) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, secondTimeIn), Convert (time, secondTimeOut) ) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, secondTimeIn), Convert (time, secondTimeOut) ) % 3600 % 60 AS VARCHAR(2)), 2)) as SecondTime
,
(RIGHT('0' + CAST(DATEDIFF(second, Convert (time, overTimeIn), Convert (time, overTimeOut) ) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, overTimeIn), Convert (time, overTimeOut) ) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, overTimeIn), Convert (time, overTimeOut) ) % 3600 % 60 AS VARCHAR(2)), 2)) as OverTimeDuration
from tbl_EmployeeAttendance Where attendanceDate BETWEEN '2019-09-01' AND '2019-09-15' And empId = '41' AND
((RIGHT('0' + CAST(DATEDIFF(second, Convert (time, firstTimeIn), Convert (time, firstTimeOut) ) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, firstTimeIn), Convert (time, firstTimeOut) ) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, firstTimeIn), Convert (time, firstTimeOut) ) % 3600 % 60 AS VARCHAR(2)), 2) ) >= '04:00:00') AND
((RIGHT('0' + CAST(DATEDIFF(second, Convert (time, secondTimeIn), Convert (time, secondTimeOut) ) / 3600 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, secondTimeIn), Convert (time, secondTimeOut) ) % 3600 / 60 AS VARCHAR(2)), 2) + ':'
+ RIGHT('0' + CAST(DATEDIFF(second, Convert (time, secondTimeIn), Convert (time, secondTimeOut) ) % 3600 % 60 AS VARCHAR(2)), 2)) >= '04:00:00')
尝试使用此代码添加表及其值....
CREATE TABLE tbl_EmployeeAttendance (
empId int,
firstTimeIn time,
firstTimeOut time,
secondTimeIn time,
secondTimeOut time,
overTimeIn time,
overTimeOut time,
attendanceDate varchar(100)
)
Insert into tbl_EmployeeAttendance VALUES ('41','07:30:00','12:10:00','12:55:00','17:20:00','17:45:00','19:30:02','2019-09-02')
Insert into tbl_EmployeeAttendance VALUES ('41','07:24:00','12:12:00','12:55:00','17:20:00','','','2019-09-03')
Insert into tbl_EmployeeAttendance VALUES ('41','07:23:00','12:10:00','12:55:00','17:20:00','','','2019-09-04')
Insert into tbl_EmployeeAttendance VALUES ('41','07:30:00','12:10:00','12:55:00','17:20:00','','','2019-09-05')
Insert into tbl_EmployeeAttendance VALUES ('41','07:24:00','12:12:00','12:55:00','17:20:00','','','2019-09-06')
Insert into tbl_EmployeeAttendance VALUES ('41','07:05:00','12:09:00','12:55:00','17:20:00','17:45:00','19:30:02','2019-09-09')
Insert into tbl_EmployeeAttendance VALUES ('41','07:05:00','12:09:00','12:55:00','17:20:00','','','2019-09-10')
Insert into tbl_EmployeeAttendance VALUES ('41','07:05:00','12:09:00','12:55:00','17:20:00','','','2019-09-11')
Insert into tbl_EmployeeAttendance VALUES ('41','07:30:00','12:09:00','12:55:00','17:20:00','','','2019-09-12')
Insert into tbl_EmployeeAttendance VALUES ('41','07:30:00','12:10:00','12:55:00','17:20:00','17:45:00','19:30:02','2019-09-13')
解决方案
使用DATEDIFF(interval,date1,date2)如果您使用MSSQL
SELECT empId, convert(varchar(5),totalFirstTiomeInHoure/3600)+':'+convert(varchar(5),totalFirstTiomeInHoure%3600/60)+':'+convert(varchar(5),(totalFirstTiomeInHoure%60)) as FirstTime,
convert(varchar(5),totalSecondTiomeInHoure/3600)+':'+convert(varchar(5),totalSecondTiomeInHoure%3600/60)+':'+convert(varchar(5),(totalSecondTiomeInHoure%60)) as SecondTime,
convert(varchar(5),totalOverTiomeInHoure/3600)+':'+convert(varchar(5),totalOverTiomeInHoure%3600/60)+':'+convert(varchar(5),(totalOverTiomeInHoure%60)) as overTime
From ( SELECT empId,
Sum(Datediff(s,firstTimeIn,firstTimeOut)) as totalFirstTiomeInHoure,
Sum(Datediff(s,secondTimeIn,secondTimeOut)) as totalSecondTiomeInHoure,
Sum(Datediff(s,overTimeIn,overTimeOut )) as totalOverTiomeInHoure
FROM [dbo].[tbl_EmployeeAttendance]
WHERE attendanceDate BETWEEN '2019-09-01' AND '2019-09-15'
GROUP BY [empId]) as TempData
推荐阅读
- c - 程序在字符串列表中查找重复字符串
- javascript - 如何在本地测试firebase onCall()?
- ios - 如何使用 Swift 4.2 在我的 WebView 中更改用户代理?
- pyspark - SnappyData 可以从 s3 加载并保存到 s3 中吗?
- cryptography - 如何在不检查整个区块链的情况下指示 UTXO 是否已被使用?
- android - 从 autocompletetextview onItemClickListener 项目获取 firestore 文档 ID
- android - 执行应用程序时返回异常 - Android
- javascript - Angular 5 document.querySelector('ClassName').innerHTML 不包含内联的css
- java - Observable#take(Long) 未在 RxJava 中返回所需的项目大小
- express - 节点/快递端点 - 抛出意外错误