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; 

      

      

  • 相关阅读:
    【流量劫持】SSLStrip 终极版 —— location 瞒天过海
    【流量劫持】沉默中的狂怒 —— Cookie 大喷发
    【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
    Web 前端攻防(2014版)
    流量劫持 —— 浮层登录框的隐患
    流量劫持能有多大危害?
    流量劫持是如何产生的?
    XSS 前端防火墙 —— 整装待发
    XSS 前端防火墙 —— 天衣无缝的防护
    XSS 前端防火墙 —— 无懈可击的钩子
  • 原文地址:https://www.cnblogs.com/binguo2008/p/7309400.html
Copyright © 2011-2022 走看看