zoukankan      html  css  js  c++  java
  • 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; 

      

      

  • 相关阅读:
    2020年3月22日
    2021年3月21日
    2021年3月20日
    人件集阅读笔记02
    2021年3月19日
    2021年3月18日
    2021年3月17日
    2021年3月16日
    2021年3月15日
    梦断代码阅读笔记01
  • 原文地址:https://www.cnblogs.com/binguo2008/p/7309400.html
Copyright © 2011-2022 走看看