我有一个名为列“WrkHrs”和数据类型是时间(HH:MM:SS)。我想总结一下员工的工作时间。但是由于数据类型sql服务器不允许我使用像sum(columnname)
那样的时间。如何总结时间字段在SQL Server
我怎么能总结一下SQL查询fieled时间数据类型?
我有一个名为列“WrkHrs”和数据类型是时间(HH:MM:SS)。我想总结一下员工的工作时间。但是由于数据类型sql服务器不允许我使用像sum(columnname)
那样的时间。如何总结时间字段在SQL Server
我怎么能总结一下SQL查询fieled时间数据类型?
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
是否合理?
我试了两列,但问题是timediff函数计算小时或分钟之间的差异,但不是在一起。我无法找到一种计算小时和分钟的方法。这就是我选择这种方式的原因。 – Sas 2012-03-15 18:51:20
恕我直言,这不是一个问题。你总是可以从几分钟获得小时/分钟。 230分钟= 2小时50分钟。我在我的回答中证明了这一点。 – 2012-03-15 18:52:24
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
为了总结工作时间为雇员就可以计算出移之间的差值开始时间和结束时间(分钟),并转换成可读格式如下:
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
的结果:02:47 2小时47分钟
为什么你使用'TIME'这种取代'INT'或'NUMERIC'?由于数据是'TIME',如果结果是'INT',那么当你聚合的工作时间大于24时,你的查询应该返回什么? – Lamak 2012-03-15 18:20:32
...或两个单独的列。 – 2012-03-15 18:27:38
@Lamak是的,我想我可能会使用数字数据类型。这对我来说会更容易。 – Sas 2012-03-15 18:53:22