我有一个名为"WrkHrs"的列,数据类型为时间(hh:mm:ss)。 我想为员工总结工作小时数。 但是,由于它是时间数据类型, SQL Server 不允许我使用像 sum(columnname)
这样的语句。
在 SQL 查询中如何对时间数据类型字段进行求和?
我有一个名为"WrkHrs"的列,数据类型为时间(hh:mm:ss)。 我想为员工总结工作小时数。 但是,由于它是时间数据类型, SQL Server 不允许我使用像 sum(columnname)
这样的语句。
在 SQL 查询中如何对时间数据类型字段进行求和?
SELECT EmployeeID, minutes_worked = SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs))
FROM dbo.table
-- WHERE ...
GROUP BY EmployeeID;
你可以在前端很好地格式化它。或者在T-SQL中:;WITH w(e, mw) AS
(
SELECT EmployeeID, SUM(DATEDIFF(MINUTE, '0:00:00', WrkHrs))
FROM dbo.table
-- WHERE ...
GROUP BY EmployeeID
)
SELECT EmployeeID = e,
WrkHrs = RTRIM(mw/60) + ':' + RIGHT('0' + RTRIM(mw%60),2)
FROM w;
然而,您使用的数据类型不正确。TIME
用于表示时间点,而不是间隔或持续时间。将他们的工作时间存储在两个不同的列中,StartTime
和EndTime
,这样做是否有意义呢?
select DATEDIFF(MINUTE, '0:00:00', '00:02:08')
结果为:2
select DATEDIFF(SECOND, '0:00:00', '00:02:08')
结果为:128
使用秒可以得到更好的答案。
因此,我认为答案可能是:
SELECT
EmployeeId
, seconds_worked = SUM (DATEDIFF (SECOND, '0:00:00', WrkHrs))
FROM
tbl_employee
GROUP BY
EmployeeId;
datediff
涉及两个值。 - shawnt00 DECLARE @StartTime datetime = '08:00'
DECLARE @EndTime datetime = '10:47'
DECLARE @durMinutes int
DECLARE @duration nvarchar(5)
SET @durMinutes = DATEDIFF(MINUTE, @StartTime, @EndTime)
SET @duration =
(SELECT RIGHT('00' + CAST((@durMinutes / 60) AS VARCHAR(2)),2) + ':' +
RIGHT('00' + CAST((@durMinutes % 60) AS VARCHAR(2)), 2))
SELECT @duration
对于MS SQL Server,当你的WorkingTime以时间或varchar存储时,为了求和,你需要考虑以下几点:
1)时间格式不支持求和,因此你需要解析它
2)23:59:59.9999999是时间的最大值。
因此,下面的代码可以计算出工作时间的总小时数、分钟数和秒数:
SELECT
CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) / 3600),'00') as varchar(max)) + ':' +
CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) % 3600 / 60),'00') as varchar(max)) + ':' +
CAST(FORMAT((SUM((DATEPART("ss",WorkingTime) + DATEPART("mi",WorkingTime) * 60 + DATEPART("hh",WorkingTime) * 3600)) % 3600 % 60),'00') as varchar(max)) as WorkingTimeSum
FROM TableName
DECLARE @Tab TABLE
(
data CHAR(5)
)
INSERT @Tab
SELECT '25:30' UNION ALL
SELECT '31:45' UNION ALL
SELECT '16:00'
SELECT STUFF(CONVERT(CHAR(8), DATEADD(SECOND, theHours + theMinutes,
'19000101'), 8), 1, 2, CAST((theHours + theMinutes) / 3600 AS VARCHAR(12)))
FROM (
SELECT ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 3600 *
LEFT(data, CHARINDEX(':', data) - 1) END)) AS theHours,
ABS(SUM(CASE CHARINDEX(':', data) WHEN 0 THEN 0 ELSE 60 *
SUBSTRING(data, CHARINDEX(':', data) + 1, 2) END)) AS theMinutes
FROM @Tab
) AS d
这应该很简单。
步骤
| present_hours |
|-----------------|
| 00:01:20.000000 |
|-----------------|
| 00:01:13.000000 |
|-----------------|
| 00:01:45.000000 |
|-----------------|
| 00:01:03.000000 |
|-----------------|
| 00:01:10.000000 |
|-----------------|
| 00:00:56.000000 |
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(present_hours))) as total_present_hours FROM time_booking;
TIME
来处理这个,而不是使用INT
或者NUMERIC
呢?既然数据是TIME
类型的,当你聚合的工作小时数大于 24 小时时,你的查询结果应该返回什么呢?结果应该是一个INT
吗? - Lamak