DateDiff输出小时和分钟

Evi*_*ing 17 sql sql-server

我的代码在几个小时内给出了总时间,但我想输出类似的东西

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)

  • 优秀 !这应该是正确的答案。为什么有人会在做其他复杂且可能出错的解决方案? (3认同)
  • 如果返回的差异超过24小时,您将无法获得所需的输出.此方法将返回除以24的差值的剩余值. (3认同)
  • Datetime2不能直接减去; 您将收到以下错误:`操作数数据类型datetime2对减法运算符无效 (2认同)
  • 致力于获取具有相同日期的两个日期的差异的小时和分钟。只是想要我需要的。谢谢! (2认同)

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使用这些单位然后应用合适的除法常数(按小时计算)一个以上)只返回小时和分钟.


Dhr*_*shi 9

像这样的小改变可以做到

  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让你在它们之间放一个冒号.

我知道这是一个老问题,但我遇到过它,并认为如果有其他人遇到它可能会有所帮助.