我的代码在几个小时内给出了总时间,但我想输出类似的东西
TotalHours
8:36
Run Code Online (Sandbox Code Playgroud)
其中8代表小时部分,36代表分钟部分是指一个人在办公室的一天工作的平均总数.
with times as (
SELECT t1.EmplID
, t3.EmplName
, min(t1.RecTime) AS InTime
, max(t2.RecTime) AS [TimeOut]
, t1.RecDate AS [DateVisited]
FROM AtdRecord t1
INNER JOIN
AtdRecord t2
ON t1.EmplID = t2.EmplID
AND t1.RecDate = t2.RecDate
AND t1.RecTime < t2.RecTime
inner join
HrEmployee t3
ON t3.EmplID = t1.EmplID
group by
t1.EmplID
, t3.EmplName
, t1.RecDate
)
SELECT EmplID
, EmplName
, InTime
, [TimeOut]
, [DateVisited]
, DATEDIFF(Hour,InTime, [TimeOut]) TotalHours
from times
Order By EmplID, DateVisited
Run Code Online (Sandbox Code Playgroud)
Mau*_*rGi 29
非常简单:
CONVERT(TIME,Date2 - Date1)
Run Code Online (Sandbox Code Playgroud)
例如:
Declare @Date2 DATETIME = '2016-01-01 10:01:10.022'
Declare @Date1 DATETIME = '2016-01-01 10:00:00.000'
Select CONVERT(TIME,@Date2 - @Date1) as ElapsedTime
Run Code Online (Sandbox Code Playgroud)
Yelds:
ElapsedTime
----------------
00:01:10.0233333
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
Vig*_*r A 14
试试这个查询
select
*,
Days = datediff(dd,0,DateDif),
Hours = datepart(hour,DateDif),
Minutes = datepart(minute,DateDif),
Seconds = datepart(second,DateDif),
MS = datepart(ms,DateDif)
from
(select
DateDif = EndDate-StartDate,
aa.*
from
( -- Test Data
Select
StartDate = convert(datetime,'20090213 02:44:37.923'),
EndDate = convert(datetime,'20090715 13:24:45.837')) aa
) a
Run Code Online (Sandbox Code Playgroud)
产量
DateDif StartDate EndDate Days Hours Minutes Seconds MS
----------------------- ----------------------- ----------------------- ---- ----- ------- ------- ---
1900-06-02 10:40:07.913 2009-02-13 02:44:37.923 2009-07-15 13:24:45.837 152 10 40 7 913
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
Dam*_*ver 12
我会把你的最终选择作为:
SELECT EmplID
, EmplName
, InTime
, [TimeOut]
, [DateVisited]
, CONVERT(varchar(3),DATEDIFF(minute,InTime, TimeOut)/60) + ':' +
RIGHT('0' + CONVERT(varchar(2),DATEDIFF(minute,InTime,TimeOut)%60),2)
as TotalHours
from times
Order By EmplID, DateVisited
Run Code Online (Sandbox Code Playgroud)
尝试使用的任何解决方案DATEDIFF(hour,...
都必然是复杂的(如果它是正确的)因为DATEDIFF
计数转换 - DATEDIFF(hour,...09:59',...10:01')
将返回1,因为小时从9转换为10.所以我只是DATEDIFF
在分钟上使用.
如果涉及秒数,上述情况仍然可能是微不足道的(因为计数分钟过渡可能会略微超量),所以如果您需要秒或毫秒精度,则需要调整DATEDIFF
使用这些单位然后应用合适的除法常数(按小时计算)一个以上)只返回小时和分钟.
像这样的小改变可以做到
SELECT EmplID
, EmplName
, InTime
, [TimeOut]
, [DateVisited]
, CASE WHEN minpart=0
THEN CAST(hourpart as nvarchar(200))+':00'
ELSE CAST((hourpart-1) as nvarchar(200))+':'+ CAST(minpart as nvarchar(200))END as 'total time'
FROM
(
SELECT EmplID, EmplName, InTime, [TimeOut], [DateVisited],
DATEDIFF(Hour,InTime, [TimeOut]) as hourpart,
DATEDIFF(minute,InTime, [TimeOut])%60 as minpart
from times) source
Run Code Online (Sandbox Code Playgroud)
小智 7
只需改变
DATEDIFF(Hour,InTime, [TimeOut]) TotalHours
Run Code Online (Sandbox Code Playgroud)
部分到
CONCAT((DATEDIFF(Minute,InTime,[TimeOut])/60),':',
(DATEDIFF(Minute,InTime,[TimeOut])%60)) TotalHours
Run Code Online (Sandbox Code Playgroud)
/ 60给你几小时,%60给你剩余的分钟,CONCAT让你在它们之间放一个冒号.
我知道这是一个老问题,但我遇到过它,并认为如果有其他人遇到它可能会有所帮助.