【问题标题】:Difference between two times format in hours [duplicate]以小时为单位的两次格式之间的差异[重复]
【发布时间】:2016-07-07 12:29:52
【问题描述】:

我在 unix 时间的数据库中有两个日期。我想要它们之间的差异,并在几个小时内显示出来。

例如
日期 1:2016 年 5 月 7 日下午 14:40:00 (1467733205)
日期 2:2016 年 5 月 7 日下午 15:40:05 (1467729600)

区别: Date2 - Date1 = 3605 秒

我想在几个小时内向他展示这个结果。 -> 1小时5秒

    SELECT TO_CHAR(to_date('01/01/1970', 'dd/mm/yyyy') + (((HOUR_DEPARTURE - DATE_LOADING )/ 60 / 60 / 24)), 'dd "days and" HH:MI:SS')
  FROM dual

我试过这样,但它应该是 01 days 和 01:00:05 。没有一日之差。

【问题讨论】:

  • 你想要什么格式的答案?我希望你想要 01:00:05,而不是你写的(一个字符串:1 小时 5 秒)。另外,如果相差 40 小时,您希望如何显示结果?
  • @AjayPunekar - 这不是重复的;您链接的问题与格式无关,这是这里唯一的问题。
  • 这和c#asp.net有什么关系?

标签: c# asp.net oracle


【解决方案1】:

您的解决方案中的 dd 从 1970 年 1 月 1 日开始选择月份中的哪一天。所以你已经从 1 天开始了。您不能简单地减去 1 来获得“0 天”,因为计算是在日历日期上完成的,而不是“天数”。

如果你想在几天内得到答案并且 hh:mi:ss 那么你可以这样做:

with
     test_data (date1, date2) as (
       select sysdate - 3605 / 86400, sysdate from dual
     )
select to_char(trunc(date2 - date1)) || ' days and ' || 
            to_char(date '1970-01-01' + (date2 - date1), 'hh24:mi:ss')
from   test_data;



TO_CHAR(TRUNC(DATE2-DATE1))||'DAYSAND'||TO_CHAR(DATE'1970-
----------------------------------------------------------
0 days and 01:00:05

【讨论】:

    【解决方案2】:

    Oracle 设置

    CREATE TABLE your_table ( date1, date2 ) AS
    SELECT 1467733205, 1467729600 FROM DUAL;
    

    查询

    SELECT TRUNC( diff ) AS days,
           TRUNC( MOD( diff * 24, 24 ) ) AS hours,
           TRUNC( MOD( diff * 24*60, 60 ) ) AS minutes,
           ROUND( MOD( diff * 24*60*60, 60 ) ) AS seconds
    FROM   (
      SELECT ( DATE '1970-01-01' + date1 /24/60/60 )
             - ( DATE '1970-01-01' + date2 /24/60/60 ) AS diff
      FROM   your_table
    );
    

    输出

    DAYS HOURS MINUTES SECONDS
    ---- ----- ------- -------
       0     1       0       5
    

    查询 2

    SELECT TRIM(
             REGEXP_REPLACE(
               REGEXP_REPLACE(
                 (  ( DATE '1970-01-01' + date1 / 24/60/60 )
                  - ( DATE '1970-01-01' + date2 / 24/60/60 ) ) DAY TO SECOND,
                 '^\+?(-?)0*(\d+) 0?(\d+):0?(\d+):0?(\d+)\.0+$'
                 '\1\2 days \3 hours \4 minutes \5 seconds'
               ),
               '(^| )0 (days|hours|minutes|seconds)'
             )
           ) AS difference
    FROM   your_table
    

    输出

    DIFFERENCE
    -----------------
    1 hours 5 seconds
    

    【讨论】:

      【解决方案3】:
      SELECT    DECODE (d,  0, NULL,  1, '1 day ',  TO_CHAR (d) || ' days ')
             || DECODE (h,  0, NULL,  1, '1 hour ',  TO_CHAR (h) || ' hours ')
             || DECODE (m,  0, NULL,  1, '1 minute ',  TO_CHAR (m) || ' minutes ')
             || DECODE (s,  0, NULL,  1, '1 second',  TO_CHAR (s) || ' seconds')
        FROM (SELECT EXTRACT (DAY FROM (dt)) d, EXTRACT (HOUR FROM (dt)) h, EXTRACT (MINUTE FROM (dt)) m, EXTRACT (SECOND FROM (dt)) s
                FROM (SELECT NUMTODSINTERVAL (:HOUR_DEPARTURE - :DATE_LOADING, 'DAY') AS dt FROM DUAL))
      

      为了好玩:

      SELECT    DECODE (y,  0, NULL,  1, '1 year ',  TO_CHAR (y) || ' years ') 
             || DECODE (m,  0, NULL,  1, '1 month ',  TO_CHAR (m) || ' months ') 
             || DECODE (d,  0, NULL,  1, '1 day ',  TO_CHAR (d) || ' days ')
             || DECODE (h,  0, NULL,  1, '1 hour ',  TO_CHAR (h) || ' hours ')
             || DECODE (mi,  0, NULL,  1, '1 minute ',  TO_CHAR (mi) || ' minutes ')
             || DECODE (s,  0, NULL,  1, '1 second',  TO_CHAR (s) || ' seconds')
        FROM (SELECT EXTRACT (YEAR FROM (ym)) y,EXTRACT (MONTH FROM (ym)) m, 
                     EXTRACT (DAY FROM (dt)) d, EXTRACT (HOUR FROM (dt)) h, EXTRACT (MINUTE FROM (dt)) mi, EXTRACT (SECOND FROM (dt)) s
                FROM (SELECT NUMTOYMINTERVAL (MONTHS_BETWEEN (:HOUR_DEPARTURE, :DATE_LOADING), 'MONTH') AS ym ,
                             NUMTODSINTERVAL (ADD_MONTHS(:HOUR_DEPARTURE,-MONTHS_BETWEEN (:HOUR_DEPARTURE, :DATE_LOADING)) - :DATE_LOADING, 'DAY') AS dt 
                        FROM DUAL
                      )
              )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2020-11-12
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多