SQL Server返回两个Date日期相差共多少天零多少小时零多少分钟零多少秒

  如果工作中遇到需要统计两个时间段相差的详细时间信息,你会怎么做?欢迎思考,欢迎讨论。我的需求是:统计两个时间段之间相差了共多少天零多少小时零多少分钟零多少秒,要求返回的是 XX天XX小时XX分钟XX秒

  1天 = 24小时 = 1440分钟 = 86400秒
  FLOOR()函数返回小于等于所给数字的最大整数,比如FLOOR(88.8)等于88。
  CEILING()函数返回大于等于所给数字的最小整数,比如CEILING(88.8)等于89。

DECLARE @BeginTime CHAR(19) = '2017-08-01 16:15:58';
DECLARE @EndTime CHAR(19) = '2017-08-08 21:21:53';

--返回小于等于两时间段最大整天数
SELECT  FLOOR(DATEDIFF(MINUTE, @BeginTime, @EndTime) / 1440) [天];

--返回小于等于两时间段最大整小时数 
SELECT  FLOOR(( DATEDIFF(MINUTE, @BeginTime, @EndTime) % 1440 ) / 60) [小时];
 
--剩余分钟数据 = (两时间段的总分钟) - [最大整天数] * 1140分钟 - [最大整小时数] * 60分钟 

--总秒数对60取余,即是剩余秒数
SELECT  DATEDIFF(SECOND, @BeginTime, @EndTime) % 60 [秒];

--测试结果:7天5小时5分钟55秒
SELECT  CAST(FLOOR(DATEDIFF(MINUTE, @BeginTime, @EndTime) / 1440) AS VARCHAR)
        + '天'
        + CAST(FLOOR(( DATEDIFF(MINUTE, @BeginTime, @EndTime) % 1440 ) / 60) AS VARCHAR)
        + '小时'
        + CAST(FLOOR(( ( DATEDIFF(MINUTE, @BeginTime, @EndTime) )
                       - ( FLOOR(DATEDIFF(MINUTE, @BeginTime, @EndTime) / 1440)
                           * 1440 ) - ( FLOOR(( DATEDIFF(MINUTE, @BeginTime,
                                                         @EndTime) % 1440 )
                                              / 60) * 60 ) ))
        + CASE WHEN DATEPART(SECOND, @BeginTime) > DATEPART(SECOND, @EndTime) 
               THEN -1
               ELSE 0
          END AS VARCHAR) + '分钟'
        + CAST(DATEDIFF(SECOND, @BeginTime, @EndTime) % 60 AS VARCHAR) + '秒';

特别注意:当DATEPART(SECOND, @BeginTime)的秒数 > DATEPART(SECOND, @EndTime)的秒数时,剩余的分钟数需要减1

想不到太好的办法,用CASE WHEN DATEPART(SECOND, @BeginTime) > DATEPART(SECOND, @EndTime) THEN -1 ELSE 0 END来实现的.

封装成函数如下:

SELECT dbo.fn_Get_Date_Diff_Info(@BeginTime,@EndTime) --返回结果:7天5小时5分钟55秒	
CREATE FUNCTION fn_Get_Date_Diff_Info
    (
      @BeginTime DATETIME ,
      @EndTime DATETIME
    )
RETURNS VARCHAR(50)
AS
    BEGIN
        RETURN(  CAST(FLOOR(DATEDIFF(MINUTE, @BeginTime, @EndTime) / 1440) AS VARCHAR)
        + '天'
        + CAST(FLOOR(( DATEDIFF(MINUTE, @BeginTime, @EndTime) % 1440 ) / 60) AS VARCHAR)
        + '小时'
        + CAST(FLOOR(( ( DATEDIFF(MINUTE, @BeginTime, @EndTime) )
                       - ( FLOOR(DATEDIFF(MINUTE, @BeginTime, @EndTime) / 1440)
                           * 1440 ) - ( FLOOR(( DATEDIFF(MINUTE, @BeginTime,
                                                         @EndTime) % 1440 )
                                              / 60) * 60 ) ))
        + CASE WHEN DATEPART(SECOND, @BeginTime) > DATEPART(SECOND, @EndTime) 
               THEN -1
               ELSE 0
          END AS VARCHAR) + '分钟'
        + CAST(DATEDIFF(SECOND, @BeginTime, @EndTime) % 60 AS VARCHAR) + '秒');
    END; 

  

  

原文地址:https://www.cnblogs.com/binguo2008/p/7309400.html