【问题标题】:SQL time difference between two dates result in hh:mm:ss两个日期之间的 SQL 时间差导致 hh:mm:ss
【发布时间】:2012-11-27 05:26:43
【问题描述】:

我在计算两个日期之间的时差时遇到了一些困难。

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

@StartDate = '10/01/2012 08:40:18.000'
@EndDate='10/04/2012 09:52:48.000'

所以hh:mm:ss 形式的两个日期之间的差是72:42:30

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

【问题讨论】:

标签: sql-server tsql


【解决方案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]

此查询将对您有所帮助。

【讨论】:

  • 你会如何填充分钟和秒数?
  • @callisto 您可以在转换周围添加格式,但必须将它们视为 INT。选择格式(convert(int, datediff(s, startDate, endDate)/3600), 'd2')+':'+format(convert(int, datediff(s, startDate, endDate)%3600/60), 'd2 ')+':'+format(convert(int, datediff(s, startDate, endDate)%60), 'd2;) as [hh:mm:ss]
  • @Spazmoose :请参阅下面我的答案以获取另一种无需转换为 int 的方式。
【解决方案2】:

最短的代码是:

Select CAST((@EndDateTime-@StartDateTime) as time(0)) '[hh:mm:ss]'

【讨论】:

  • 这仅适用于 datetime 数据类型,不适用于 datetime2 数据类型
  • 如何更改以显示真实小时数?比如 36:12:41?
  • 这不考虑天数
【解决方案3】:

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

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

如果您可以运行两个选择,那么这会更好,因为您只执行一次 datediff:

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

【讨论】:

    【解决方案4】:

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

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

    用法:

    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
    

    结果:

        DateDifference
    1   73:12:30
    

    如果添加填充也更容易阅读结果,因此格式始终为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
    

    请注意,如果小时数超过 2 位,这将不会剪辑小时。所以 1 小时将显示为 01:00:00,而 100 小时将显示为 100:00:00

    【讨论】:

    • 这是我最喜欢的答案,因为它具有可重用性和格式(代码和结果填充)。并感谢您确保它在持续时间 >= 100 小时时处理
    【解决方案5】:

    如果您不反对隐式类型转换,我将提供另一种解决方案。更好的格式是否更具可读性?你是法官。

    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)
    

    【讨论】:

      【解决方案6】:
      DECLARE @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12'
      
      SELECT CAST((@dt2-@dt1) as time(0))
      

      【讨论】:

      • 在单个 select 语句中,我有一列返回未来的时间,第二列是 getdate(),第三列使用您的逻辑将 dt2 和 dt1 替换为未来日期的定义和 getdate() 分别。返回值为 2017-04-12 21:00:00.000 2017-04-11 10:14:20.590 13:14:21 根据我的数学计算,它们之间应该有大约 24+11 小时,也就是说,它们之间是 35 小时,而不是 13 .
      【解决方案7】:

      如果您需要两个日期之间的零填充差异:

      SELECT convert(varchar(2),FORMAT(DATEDIFF(s, @startDate, @endDate)/3600,'0#'))+':'    
         +convert(varchar(2),FORMAT(DATEDIFF(s, @startDate, @endDate)%3600/60,'0#'))+':'
         +convert(varchar(2),FORMAT(DATEDIFF(s, @startDate, @endDate)%60,'0#')) AS Duration
      

      【讨论】:

        【解决方案8】:

        试试这个:

        declare @StartDate datetime, @EndDate datetime
        
        select @StartDate = '2016-05-04 10:23:41.083', @EndDate='2016-05-04 10:25:26.053'
        
        select CAST(DateDiff(MI, @startDate, @EndDate)/60 AS varchar)+':'+Cast(DateDiff(MI, @startDate, @EndDate)%60 AS varchar)+':'+cast(DateDiff(s, @startDate, @EndDate)%60 AS varchar) as [hh:mm:ss]
        

        【讨论】:

          【解决方案9】:

          看看这些。我没有使用更多的括号来保持可读性,所以请记住,乘法是在加法或减法之前完成的。

          以下均返回:

          hr  mins  sec   timediff
          73   12    30   73:12:30
          

          这是为了不使用子查询而编写的,并且是最易读易懂的:

          declare @StartDate datetime,
          @EndDate datetime
          
          set @StartDate = '10/01/2012 08:40:18.000'
          set @EndDate =   '10/04/2012 09:52:48.000' 
          
          select datediff(hour, @StartDate, @EndDate) hr,
             datediff(minute, @StartDate, @EndDate) 
             - datediff(hour, @StartDate, @EndDate) * 60 mins,
             datediff(second, @StartDate, @EndDate) 
             - (datediff(minute, @StartDate, @EndDate) * 60) sec,
             cast(datediff(hour, @StartDate, @EndDate) as varchar)+':'+ 
             cast(datediff(minute, @StartDate, @EndDate) 
             - datediff(hour, @StartDate, @EndDate) * 60 as varchar)+':'+ 
             cast(datediff(second, @StartDate, @EndDate) 
             - (datediff(minute, @StartDate, @EndDate) * 60) as varchar) timediff
          

          如果您有大量数据,此版本的性能会更好。它需要一个子查询。

          declare @StartDate datetime,
          @EndDate datetime
          
          set @StartDate = '10/01/2012 08:40:18.000'
          set @EndDate =   '10/04/2012 09:52:48.000' 
          
          select s.seconds / 3600  hrs,
          s.seconds / 60 - (seconds / 3600 ) * 60 mins,
          s.seconds - (s.seconds / 60) * 60   seconds,
          cast(s.seconds / 3600 as varchar) + ':' +
          cast((s.seconds / 60 - (seconds / 3600 ) * 60) as varchar) + ':' +
          cast((s.seconds - (s.seconds / 60) * 60) as varchar) timediff
          from (select datediff(second, @StartDate, @EndDate) as seconds) s
          

          【讨论】:

            【解决方案10】:

            我今天偶然发现了这篇文章,因为我试图收集位于不同表中的字段之间的时差,这些表在一​​个关键字段上连接在一起。这是这种努力的工作代码。 (在 sql 2010 中测试) 请记住,我的原始查询在一个公共键域上共同连接了 6 个表,在下面的代码中,我删除了其他表,以免给读者造成任何混淆。

            查询的目的是计算变量 CreatedUTC 和 BackupUTC 之间的差异,其中差异以天数表示,该字段称为“DaysActive”。

            declare @CreatedUTC datetime
            declare @BackupUtc datetime
            
            
            SELECT TOP 500
            
            table02.Column_CreatedUTC AS DeviceCreated,
            CAST(DATEDIFF(day, table02.Column_CreatedUTC, table03.Column_EndDateUTC) AS nvarchar(5))+ ' Days' As DaysActive,
            table03.Column_EndDateUTC AS LastCompleteBackup
            
            FROM
            
            Operations.table01 AS table01
            
            LEFT OUTER JOIN
            
                dbo.table02 AS table02
            ON
                table02.Column_KeyField = table01.Column_KeyField
            
            LEFT OUTER JOIN 
            
                dbo.table03 AS table03
            ON
                table01.Column_KeyField = table03.Column_KeyField
            
            Where table03.Column_EndDateUTC > dateadd(hour, -24, getutcdate()) --Gathers records with an end date in the last 24 hours
            AND table02.[Column_CreatedUTC] = COALESCE(@CreatedUTC, table02.[Column_CreatedUTC])
            AND table03.[Column_EndDateUTC] = COALESCE(@BackupUTC, table03.[Column_EndDateUTC])
            
            GROUP BY table03.Column_EndDateUTC, table02.Column_CreatedUTC
            ORDER BY table02.Column_CreatedUTC ASC, DaysActive, table03.Column_EndDateUTC DESC
            

            输出如下:

            [DeviceCreated]..[DaysActive]..[LastCompleteBackup]
            ---------------------------------------------------------
            [2/13/12 16:04]..[463 Days]....[5/21/13 12:14]
            [2/12/13 22:37]..[97 Days].....[5/20/13 22:10]
            

            【讨论】:

              【解决方案11】:

              这是一个脚本写入副本,然后写入您的脚本文件并更改 你要求的领域,然后出去

              DECLARE @Sdate DATETIME, @Edate DATETIME, @Timediff VARCHAR(100)
              SELECT @Sdate = '02/12/2014 08:40:18.000',@Edate='02/13/2014 09:52:48.000'
              SET @Timediff=DATEDIFF(s, @Sdate, @Edate)
              SELECT CONVERT(VARCHAR(5),@Timediff/3600)+':'+convert(varchar(5),@Timediff%3600/60)+':'+convert(varchar(5),@Timediff%60) AS TimeDiff
              

              【讨论】:

                【解决方案12】:
                DECLARE  @StartDate datetime = '10/01/2012 08:40:18.000'
                        ,@EndDate   datetime = '10/10/2012 09:52:48.000'
                        ,@DaysDifferent int = 0
                        ,@Sec BIGINT
                
                select @Sec = DateDiff(s, @StartDate, @EndDate)
                
                IF (DATEDIFF(day, @StartDate, @EndDate) > 0)
                    BEGIN
                        select @DaysDifferent = DATEDIFF(day, @StartDate, @EndDate)
                        select @Sec = @Sec - ( @DaysDifferent * 86400 )
                        SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss]
                    END
                ELSE
                    BEGIN
                        SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss]
                    END
                
                ----------------------------------------------------------------------------------
                dd HH:MM:SS
                9d 1:12:30
                

                【讨论】:

                  【解决方案13】:
                  declare @StartDate datetime,
                  @EndDate datetime
                  set @StartDate = '10/01/2012 08:40:18.000'
                  set @EndDate =   '10/01/2012 09:52:48.000'
                  
                  SELECT CONVERT(CHAR(8), CAST(CONVERT(varchar(23),@EndDate,121) AS DATETIME)
                  -CAST(CONVERT(varchar(23),@StartDate,121)AS DATETIME),8) AS TimeDiff
                  

                  【讨论】:

                  • 结果为:“01:12:30”。
                  【解决方案14】:
                  declare @StartDate datetime;
                  declare @EndDate datetime;
                  select @StartDate = '10/01/2012 08:40:18.000';
                  select @EndDate='10/04/2012 09:52:48.000';
                  select  cast(datediff(hour,@StartDate,@EndDate) as varchar(10)) + left(right(cast(cast(cast((@EndDate-@StartDate) as datetime) as time) as varchar(16)),14),6)
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-10-21
                    • 2016-02-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-06-21
                    • 2013-09-08
                    相关资源
                    最近更新 更多