【问题标题】:The difference between two dates in the same column in oracle in days/Hours/minutesoracle中同一列中两个日期之间的差异,以天/小时/分钟为单位
【发布时间】:2014-05-12 16:34:09
【问题描述】:

我希望以天/小时/分钟计算两个日期之间的差异。

我有一个具有以下数据结构的表:

 ID                   Date                           Location          Type
---------------------------------------------------------------------------------
42ABC          15-NOV-14 12.45.00 PM                    YY            Departed 
42ABC          15-NOV-14 03.10.00 PM                    AA            Arrived
42ABC          18-NOV-14 05.15.00 PM                    AA            Departed
42ABC          18-NOV-14 07.20.00 PM                    YY            Arrived

我如何计算日期的差异,并得到这样的结果:

ID                Location                   DURATION
-----------------------------------------------------------------
42ABC               AA                 3 days, 2 hours, 5 minutes 

感谢您对此的意见。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    想到的第一个解决方案是:

    SELECT id,
           location,
              TRUNC (date_diff)
           || ' days, '
           || TRUNC ( (date_diff - TRUNC (date_diff)) * 24)
           || ' hours, '
           || MOD ( (date_diff - TRUNC (date_diff)) * 24, 10) * 60
           || ' minutes'
    FROM   (SELECT   id, location, MAX (date) - MIN (date) AS date_diff
            FROM     your_table
            GROUP BY id, location)
    

    当您在 Oracle 中减去两个日期时,结果是一个代表天数的十进制数,因此从那里得出小时和分钟只是数学运算。如果您希望它更复杂(例如,如果数字为零,则删除部分),那么我建议使用函数。

    也可以通过将date 转换为timestamp 来使用稍微简单的解决方案,这会产生interval 类型的结果,而不是decimal


    interval 解决方案:

    SELECT id,
           location,
              EXTRACT (DAY FROM date_diff)
           || ' days, '
           || EXTRACT (HOUR FROM date_diff)
           || ' hours, '
           || EXTRACT (MINUTE FROM date_diff)
           || ' minutes'
    FROM   (SELECT   id, location, 
                     CAST(MAX (date) as timestamp) 
                     - CAST(MIN (date) as timestamp) AS date_diff
            FROM     your_table
            GROUP BY id, location)
    

    【讨论】:

      【解决方案2】:

      这样可以的:

      select T1.ID, T2.LOCATION, round(T2.DDATE - T1.DDATE) || ' days, ' ||
                  trunc(mod((T2.DDATE - T1.DDATE)*24, 24)) || ' hours, ' ||
                  trunc(mod((T2.DDATE - T1.DDATE)*24*60, 60)) || ' minutes' duration
      from YOUR_TABLE T1, YOUR_TABLE T2
      where T2.ID = T1.ID
        and T2.LOCATION = T1.LOCATION
        and T1.TYPE = 'Arrived'
        and T2.TYPE = 'Departed'
      ;
      

      【讨论】:

        猜你喜欢
        • 2012-01-03
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 2011-11-29
        • 2017-07-06
        • 2011-04-03
        • 1970-01-01
        相关资源
        最近更新 更多