2012-03-15 108 views
19

我有一个名为列“WrkHrs”和数据类型是时间(HH:MM:SS)。我想总结一下员工的工作时间。但是由于数据类型sql服务器不允许我使用像sum(columnname)那样的时间。如何总结时间字段在SQL Server

我怎么能总结一下SQL查询fieled时间数据类型?

+2

为什么你使用'TIME'这种取代'INT'或'NUMERIC'?由于数据是'TIME',如果结果是'INT',那么当你聚合的工作时间大于24时,你的查询应该返回什么? – Lamak 2012-03-15 18:20:32

+0

...或两个单独的列。 – 2012-03-15 18:27:38

+0

@Lamak是的,我想我可能会使用数字数据类型。这对我来说会更容易。 – Sas 2012-03-15 18:53:22

回答

21
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用于指示一个时间点,而不是间隔或持续时间。将他们的工作时间存储在两个不同的列中,StartTimeEndTime是否合理?

+0

我试了两列,但问题是timediff函数计算小时或分钟之间的差异,但不是在一起。我无法找到一种计算小时和分钟的方法。这就是我选择这种方式的原因。 – Sas 2012-03-15 18:51:20

+1

恕我直言,这不是一个问题。你总是可以从几分钟获得小时/分钟。 230分钟= 2小时50分钟。我在我的回答中证明了这一点。 – 2012-03-15 18:52:24

2
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 
3

为了总结工作时间为雇员就可以计算出移之间的差值开始时间和结束时间(分钟),并转换成可读格式如下:

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分钟