SQL time difference between two dates result in hh:mm:ss
declare @StartDate datetime, @EndDate datetime
select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000'
select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) as [hh:mm:ss]
This query will helpful to you.
DATEDIFF in HH:MM:SS format
You shouldn't be converting to time
- it is meant to store a point in time on a single 24h clock, not a duration or interval (even one that is constrained on its own to < 24 hours, which clearly your data is not). Instead you can take the datediff in the smallest interval required (in your case, seconds), and then perform some math and string manipulation to present it in the output format you need (it might also be preferable to return the seconds to the application or report tool and have it do this work).
DECLARE @d TABLE
(
id INT IDENTITY(1,1),
StartDateTime DATETIME,
EndDateTime DATETIME
);
INSERT @d(StartDateTime, EndDateTime) VALUES
(DATEADD(DAY, -2, GETDATE()), DATEADD(MINUTE, 15, GETDATE())),
(GETDATE() , DATEADD(MINUTE, 22, GETDATE())),
(DATEADD(DAY, -1, GETDATE()), DATEADD(MINUTE, 5, GETDATE())),
(DATEADD(DAY, -4, GETDATE()), DATEADD(SECOND, 14, GETDATE()));
;WITH x AS (SELECT id, StartDateTime, EndDateTime,
d = DATEDIFF(SECOND, StartDateTime, EndDateTime),
a = AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER()
FROM @d
)
SELECT id, StartDateTime, EndDateTime,
[delta_HH:MM:SS] = CONVERT(VARCHAR(5), d/60/60)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), d/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2),
[avg_HH:MM:SS] = CONVERT(VARCHAR(5), a/60/60)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2)
FROM x;
Results:
id StartDateTime EndDateTime delta_HH:MM:SS avg_HH:MM:SS
-- ------------------- ------------------- -------------- ------------
1 2013-01-19 14:24:46 2013-01-21 14:39:46 48:15:00 42:10:33
2 2013-01-21 14:24:46 2013-01-21 14:46:46 0:22:00 42:10:33
3 2013-01-20 14:24:46 2013-01-21 14:29:46 24:05:00 42:10:33
4 2013-01-17 14:24:46 2013-01-21 14:25:00 96:00:14 42:10:33
This isn't precisely what you asked for, as it won't show just MM:SS for deltas < 1 hour. You can adjust that with a simple CASE
expression:
;WITH x AS (SELECT id, StartDateTime, EndDateTime,
d = DATEDIFF(SECOND, StartDateTime, EndDateTime),
a = AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER()
FROM @d
)
SELECT id, StartDateTime, EndDateTime,
[delta_HH:MM:SS] = CASE WHEN d >= 3600 THEN
CONVERT(VARCHAR(5), d/60/60) + ':' ELSE '' END
+ RIGHT('0' + CONVERT(VARCHAR(2), d/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2),
[avg_HH:MM:SS] = CASE WHEN a >= 3600 THEN
CONVERT(VARCHAR(5), a/60/60) + ':' ELSE '' END
+ RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2)
+ ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2)
FROM x;
This query changes the delta column in the 2nd row in the above result from 0:22:00
to 22:00
.
Calculate time difference in HH:MM:SS
You can use this for With DATETIME
DECLARE @START_DATE datetime DECLARE @END_DATE datetime
-- Set the timeframe variables
SET @START_DATE = '2011-01-01 16:00:00' SET @END_DATE = '2011-01-01 22:47:22'
-- Use datediff to show the results in the
-- HH:MM:SS format
SELECT CONVERT(VARCHAR(6), datediff(second, @START_DATE, @END_DATE)/3600) + ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), (datediff(second, @START_DATE, @END_DATE) %
3600) / 60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), datediff(second,
@START_DATE, @END_DATE) % 60), 2)
Result :
HH:MM:SS
6:47:22
OR With TIME
-- Declare some variables for the requested timeframe
DECLARE @START_DATE TIME
DECLARE @END_DATE TIME-- Set the timeframe variables
SET @START_DATE = '16:00:00'
SET @END_DATE = '22:47:22'-- Use datediff to show the results in the
-- HH:MM:SS format
SELECT CONVERT(VARCHAR(6), Datediff(second, @START_DATE, @END_DATE)/3600)
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), (Datediff(second, @START_DATE,
@END_DATE) %
3600) / 60), 2)
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), Datediff(second, @START_DATE, @END_DATE
) % 60)
, 2) AS 'HH:MM:SS'
AS Per Edit
;
WITH cte
AS (SELECT EMPID,
Min(TIMEIN) timein,
Max(TIMEOUT) timeout,
Cast(COALESCE(TIMEIN, TIMEOUT) AS DATE) d
FROM @T
GROUP BY EMPID,
Cast(COALESCE(TIMEIN, TIMEOUT) AS DATE))
SELECT EMPID,
D AS Day,
CONVERT(VARCHAR(6), Datediff(second, TIMEIN, TIMEOUT)/3600)
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), (Datediff(second, TIMEIN, TIMEOUT) %
3600) /
60), 2)
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), Datediff(second, TIMEIN, TIMEOUT) % 60)
, 2 )
AS [Hours Worked]
FROM cte
ORDER BY D ASC
Result
empid Day Hours Worked
1 2018-01-10 9:00:00
1 2018-01-11 9:33:00
Resolve After Mistake of preiviuos senario
SELECT FirstIN, LastOUT,
CONVERT(VARCHAR(6), Datediff(second, FirstIN, LastOUT)/3600)
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), (Datediff(second, FirstIN, LastOUT) %
3600) /
60), 2)
+ ':'
+ RIGHT('0' + CONVERT(VARCHAR(2), Datediff(second, FirstIN, LastOUT) % 60)
, 2 ) AS
HoursSpent,[Date] FROM (
SELECT
FirstIN = CAST(MIN([TimeIn]) AS TIME),
LastOUT = CAST(MAX([TimeOut]) AS TIME),
HoursSpent = DATEDIFF(HOUR, CAST(MIN(TimeIn) AS TIME), CAST(MAX(TimeOut) AS TIME)),
CAST(COALESCE(TimeIn, TimeOut) AS DATE) [Date]
FROM @T
GROUP BY
CAST(COALESCE(TimeIn, TimeOut) AS DATE)) AS a
DateDiff for [datetime2](7) in hh:mm;ss format
You can try the following query.
SELECT CONVERT(VARCHAR(12), DATEADD(MS, DATEDIFF(MS,startDate, endDate), 0), 108) AS TimeDiff from Duration
How to subtract two datetime values and get the output in HH:MM:SS format in SQL Server?
Something like:
with q as
(
select datediff(SECOND, '2019-07-16 04:45:03.000','2019-07-17 19:38:13.000') secs
), hms as
(
select secs/60/60 as hours, (secs/60) % 60 as minutes , secs % 60 seconds
from q
)
select concat(format(hours,'00'),':',format(minutes,'00'),':',format(seconds,'00') ) hms
from hms
which returns
38:53:10
SQL - datediff returns hours, but I want to add minutes and seconds in HH:MM:SS
You can convert the number of seconds as a time. I don't easily follow the logic of your code, but the conversion is simple enough:
select cast(dateadd(second,
datediff(second, <starttime>, <enddatime>),
0) as time
)
What is the best way to calculate the difference in format hh:mm:ss from a date to end of date?
You can use calculate the next date by dateadd, and then use datediff to find the seconds to next day, and convert the result to timestamp.
set t = to_timestamp('2019-10-11 16:47:44.042');
select to_varchar( to_timestamp( DATEDIFF('ms', $t, dateadd( 'day',1, date_trunc('DAY', $t )) ) / 1000 ), 'HH24:MI:SS.FF3');
Dividing to 1000 is a trick that you can not find anywhere else! :)
You can create a function based on the above formula:
create or replace function timetoendofday ( t timestamp )
returns varchar
as 'select to_varchar( to_timestamp( DATEDIFF(''ms'', t, dateadd( ''day'',1, date_trunc(''DAY'', t )) ) / 1000 ), ''HH24:MI:SS.FF3'')';
Now it's simple to use:
select timetoendofday( '2019-10-11 16:47:44.042' );
-- returns 07:12:15.958
SQL. Convert datediff hours to dd.hh:mm:ss
watch out for the case where the 'time' in the start day has not been reached in the end date
select cast(DATEDIFF(SECOND,MIN(OLDESTRECORD),GETDATE()) / 86400 as varchar(4)) + '.' + CONVERT(CHAR(8),DATEADD(SECOND,DATEDIFF(SECOND,MIN(OLDESTRECORD),GETDATE()) % 86400 ,0),108)
Related Topics
Read the Log File (*.Ldf) in SQL Server 2008
Database Normalization - Who's Right
Oracle Table Column Name with Space
How to Generate a Hierarchy Path in SQL That Leads to a Given Node
Return Count 0 with MySQL Group By
Split String into Several Rows
Optional Where Clause Jasper Reports
Ms Access Date Triggers Emulation
Is It Faster to Access Data from Files or a Database Server
Oracle SQL - Sum and Group Data by Week
Joining Two Tables in Hive Using Hiveql(Hadoop)
How to Find Out Whether a Table Has Some Unique Columns
Invalid Column Name on SQL Server Update After Column Create
MySQL - Creating Rows VS. Columns Performance
How to Use Like and in for a Where Statment
SQL Query to Translate a List of Numbers Matched Against Several Ranges, to a List of Values