SQL time difference between two dates result in hh:mm:ss
Solution 1:
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.
Solution 2:
The shortest code would be:
Select CAST((@EndDateTime-@StartDateTime) as time(0)) '[hh:mm:ss]'
Solution 3:
While maybe not the most efficient, this would work:
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))
if you can run two selects then this would be better because you only do the datediff once:
declare @StartDate datetime, @EndDate datetime
select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000'
declare @Sec BIGINT
select @Sec = DateDiff(s, @startDate, @EndDate)
select convert(varchar(5),@sec/3600)+':'+convert(varchar(5),@sec%3600/60)+':'+convert(varchar(5),(@sec%60))
Solution 4:
I like the idea of making this into a function so it becomes re-useable and your queries become much easier to read:
--get the difference between two datetimes in the format: 'h:m:s'
CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME)
RETURNS VARCHAR(10)
AS BEGIN
DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate)
DECLARE @difference VARCHAR(10) =
CONVERT(VARCHAR(4), @seconds / 3600) + ':' +
CONVERT(VARCHAR(2), @seconds % 3600 / 60) + ':' +
CONVERT(VARCHAR(2), @seconds % 60)
RETURN @difference
END
Usage:
DECLARE @StartDate DATETIME = '10/01/2012 08:40:18.000'
DECLARE @endDate DATETIME = '10/04/2012 09:52:48.000'
SELECT dbo.getDateDiff(@startDate, @endDate) AS DateDifference
Result:
DateDifference
1 73:12:30
It's also easier to read the result if you add padding so the format is always hh:mm:ss
. For example, here's how you would do that in SQL Server 2012 or later:
--get the difference between two datetimes in the format: 'hh:mm:ss'
CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME)
RETURNS VARCHAR(10)
AS BEGIN
DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate)
DECLARE @difference VARCHAR(10) =
FORMAT(@seconds / 3600, '00') + ':' +
FORMAT(@seconds % 3600 / 60, '00') + ':' +
FORMAT(@seconds % 60, '00')
RETURN @difference
END
Note that this will not clip the hour if it is more than 2 digits long. So 1 hour would show up as 01:00:00
and 100 hours would show up as 100:00:00
Solution 5:
If you're not opposed to implicit type casting I'll offer this an alternative solution. Is it more readable with better formatting? You be the judge.
DECLARE @StartDate datetime = '10/01/2012 08:40:18.000'
,@EndDate datetime = '10/04/2012 09:52:48.000'
SELECT
STR(ss/3600, 5) + ':' + RIGHT('0' + LTRIM(ss%3600/60), 2) + ':' + RIGHT('0' + LTRIM(ss%60), 2) AS [hh:mm:ss]
FROM (VALUES(DATEDIFF(s, @StartDate, @EndDate))) seconds (ss)