两个日期之间的SQL时差导致hh:mm:ss

Gna*_*amy 25 t-sql sql-server

我在计算两个日期之间的时差时面临一些困难.

我想要的是,我有两个日期可以说

@StartDate = '10/01/2012 08:40:18.000'
@EndDate='10/04/2012 09:52:48.000'
Run Code Online (Sandbox Code Playgroud)

所以两个日期之间的区别hh:mm:ss72:42:30.

如何在T-SQL查询中获得此结果?

Fra*_*lin 42

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]
Run Code Online (Sandbox Code Playgroud)

此查询对您有所帮助.


SQL*_*nbe 26

最短的代码是:

Select CAST((@EndDateTime-@StartDateTime) as time(0)) '[hh:mm:ss]'
Run Code Online (Sandbox Code Playgroud)

  • 此外,这只适用于 datetime 数据类型,不适用于 datetime2 数据类型 (2认同)
  • 如何更改以显示真实的时间?例如 36:12:41? (2认同)
  • 这不需要考虑几天 (2认同)

Gre*_*reg 9

虽然可能不是最有效的,但这可行:

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))
Run Code Online (Sandbox Code Playgroud)

如果你可以运行两个选择那么这会更好,因为你只做了一次:

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))
Run Code Online (Sandbox Code Playgroud)


小智 5

DECLARE @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'

SELECT CAST((@dt2-@dt1) as time(0))
Run Code Online (Sandbox Code Playgroud)


Mar*_*ese 5

我喜欢使它成为一个函数的想法,这样它就可以重新使用,并且您的查询也变得更容易阅读:

--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
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)

结果:

    DateDifference
1   73:12:30
Run Code Online (Sandbox Code Playgroud)

如果添加填充,读取结果也更容易,因此格式始终为hh:mm:ss。例如,这是在SQL Server 2012或更高版本中的处理方式:

--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
Run Code Online (Sandbox Code Playgroud)

请注意,如果长度超过2位,则不会截断小时。所以1小时将显示为,01:00:00而100小时将显示为100:00:00