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))