DateDiff для вывода часов и минут

мой код дает TOTAL HOURS в часах, но я пытаюсь вывести что-то вроде

TotalHours 
  8:36

где 8 представляет собой часовую часть, а 36 представляет собой минутное среднее значение totalHours человек работал в течение одного дня в офисе.

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 

Ответ 1

Небольшое изменение, подобное этому, может быть выполнено

  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

Ответ 2

Очень просто:

CONVERT(TIME,Date2 - Date1)

Например:

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

Yelds:

ElapsedTime
----------------
00:01:10.0233333

(1 row(s) affected)

Ответ 3

Попробуйте этот запрос

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

Выход

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)

Ответ 4

Я бы сделал ваш окончательный выбор следующим:

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 

Любое решение, пытающееся использовать DATEDIFF(hour,..., должно быть сложным (если оно правильно), потому что DATEDIFF считает переходы - DATEDIFF(hour,...09:59',...10:01') вернет 1 из-за перехода часа от 9 до 10. Так что я просто используя DATEDIFF в минутах.

Вышеизложенное может по-прежнему быть неточным, если задействованы секунды (он может немного перевыполнить, поскольку его счетные минуты переходят), поэтому, если вам нужна вторая или миллисекундная точность, вам нужно настроить DATEDIFF для использования этих единиц, а затем применить соответствующее разделение константы (согласно часам, указанным выше), чтобы просто вернуть часы и минуты.

Ответ 5

Просто измените

DATEDIFF(Hour,InTime, [TimeOut]) TotalHours

часть

CONCAT((DATEDIFF(Minute,InTime,[TimeOut])/60),':',
       (DATEDIFF(Minute,InTime,[TimeOut])%60)) TotalHours 

Параметр/60 дает вам часы,% 60 дает вам оставшиеся минуты, а CONCAT позволяет установить между ними двоеточие.

Я знаю, что это старый вопрос, но я наткнулся на него и подумал, что это может помочь, если кто-то другой встретит его.

Ответ 6

Поставьте свое соответствующее значение и попробуйте следующее:

declare @x int, @y varchar(200),
        @dt1 smalldatetime = '2014-01-21 10:00:00', 
        @dt2 smalldatetime = getdate()

set @x = datediff (HOUR, @dt1, @dt2)
set @y =  @x * 60 -  DATEDIFF(minute,@dt1, @dt2)
set @y = cast(@x as varchar(200)) + ':' + @y
Select @y

Ответ 7

это поможет вам

 DECLARE @DATE1 datetime = '2014-01-22 9:07:58.923'
 DECLARE @DATE2 datetime = '2014-01-22 10:20:58.923'
 SELECT DATEDIFF(HOUR, @DATE1,@DATE2) ,
        DATEDIFF(MINUTE, @DATE1,@DATE2) - (DATEDIFF(HOUR,@DATE1,@DATE2)*60)

 SELECT CAST(DATEDIFF(HOUR, @DATE1,@DATE2) AS nvarchar(200)) +
        ':'+ CAST(DATEDIFF(MINUTE, @DATE1,@DATE2)  -
                 (DATEDIFF(HOUR,@DATE1,@DATE2)*60) AS nvarchar(200))
As TotalHours 

Ответ 8

Так как любое DateTime может быть перенесено в float, а десятичная часть номера представляет собой самое время:

DECLARE @date DATETIME = GETDATE()

SELECT CAST(CAST(@date AS FLOAT) - FLOOR(CAST(@date AS FLOAT)) AS DATETIME

Это приведет к дате времени, например, "1900-01-01 час дня", вы можете использовать его как время, временную метку или даже использовать преобразование, чтобы получить отформатированное время.

Я предполагаю, что это работает в любой версии SQL, так как приведение даты и времени в float совместимо с версией 2005.

Надеюсь, что это поможет.

Ответ 9

Разделите Datediff в MS на количество мс в день, добавьте к Datetime, а затем ко времени:

Declare @D1 datetime = '2015-10-21 14:06:22.780', @D2 datetime = '2015-10-21 14:16:16.893'

Select  Convert(time,Convert(Datetime, Datediff(ms,@d1, @d2) / 86400000.0))

Ответ 10

Если вы хотите формат 08:30 (HH: MM), попробуйте это,

SELECT EmplID
    , EmplName
    , InTime
    , [TimeOut]
    , [DateVisited]
    ,  RIGHT('0' + CONVERT(varchar(3),DATEDIFF(minute,InTime, TimeOut)/60),2) + ':' +
      RIGHT('0' + CONVERT(varchar(2),DATEDIFF(minute,InTime,TimeOut)%60),2)
      as TotalHours from times Order By EmplID, DateVisited

Ответ 11

Не нужно прыгать через обручи. Вычитание Start from End существенно дает вам время (сочетая ответы Виньеша Кумара и Карла Ницше):

SELECT *,
    --as a time object
    TotalHours = CONVERT(time, EndDate - StartDate),
    --as a formatted string
    TotalHoursText = CONVERT(varchar(20), EndDate - StartDate, 114)
FROM (
    --some test values (across days, but OP only cares about the time, not date)
    SELECT
        StartDate = CONVERT(datetime,'20090213 02:44:37.923'),
        EndDate   = CONVERT(datetime,'20090715 13:24:45.837')
) t

Ouput

StartDate               EndDate                 TotalHours       TotalHoursText
----------------------- ----------------------- ---------------- --------------------
2009-02-13 02:44:37.923 2009-07-15 13:24:45.837 10:40:07.9130000 10:40:07:913

Смотрите полный список вариантов и конвертировать здесь: https://msdn.microsoft.com/en-us/library/ms187928.aspx

Ответ 12

В случае, если кто-то все еще ищет запрос для отображения разницы в формате hr min и sec: (Это отобразит разницу в этом формате: 2 hr 20 min 22 sec)

SELECT
CAST(DATEDIFF(minute, StartDateTime, EndDateTime)/ 60 as nvarchar(20)) + ' hrs ' + CAST(DATEDIFF(second, StartDateTime, EndDateTime)/60 as nvarchar(20)) + ' mins' +          CAST(DATEDIFF(second, StartDateTime, EndDateTime)% 60 as nvarchar(20))  + ' secs'

ИЛИ может быть в формате как в вопросе:

CAST(DATEDIFF(minute, StartDateTime, EndDateTime)/ 60 as nvarchar(20)) + ':' + CAST(DATEDIFF(second, StartDateTime, EndDateTime)/60 as nvarchar(20))