我有一個名爲列「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