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; 

      

      

  • 相关阅读:
    资源链接
    Silverlight4 RIA应用开发
    社会心理学(第8版)
    C# 2.0 锐利体验
    C# 3.0 锐利体验
    C#面向对象设计模式纵横谈
    ASP.NET MVC2程序开发入门到精通
    Silverlight数独游戏
    StringBuilder研究和探索
    .NET 开发从入门到精通
  • 原文地址:https://www.cnblogs.com/binguo2008/p/7309400.html
Copyright © 2011-2022 走看看