【问题标题】:Time difference in oracle预言机的时差
【发布时间】:2013-12-05 06:04:12
【问题描述】:

您好,我有下表,其中包含开始时间、结束时间、总时间


STARTTIME            | ENDTIME             | TOTAL TIME TAKEN  |
02-12-2013 01:24:00  | 02-12-2013 04:17:00 |  02:53:00         |

我需要使用 oracle 中的更新查询更新TOTAL TIME TAKEN 字段

为此,我尝试了以下选择查询

select  round((endtime-starttime) * 60 * 24,2),
        endtime,
        starttime 
  from purge_archive_status_log

但结果是我得到 02.53,但我的期望格式是 02:53:00 请告诉我该怎么做?

【问题讨论】:

  • 也许这篇文章可以帮助stackoverflow.com/questions/970249/format-interval-with-to-char 好像endtimestarttime 是DATE 类型,那么endtime-starttime 将是一个间隔。顺便说一句,您为什么要保存一个包含可以在查询中计算的数据的列?最好不要使用virtual columns
  • @A.B.Cade 我试过这样没用select TO_CHAR(NVL(endtime-starttime, TO_DSINTERVAL('0 00:00:00'))) from purge_archive_status_log
  • 不,根据帖子你需要做这样的事情:to_char(extract(HOUR FROM (endtime-starttime)), 'fm00') || ':' || to_char(extract(MINUTE FROM (endtime-starttime)), 'fm00') || ':' || to_char(extract(SECOND FROM (endtime-starttime)), 'fm00')

标签: oracle timestamp


【解决方案1】:

可能根本没有理由在您的表中包含 total_time_taken 列,您始终可以计算它的值。但是如果您坚持保留它,最好将其重新创建为interval day to second 数据类型的列,而不是varchar2(假设这是它当前的数据类型)。所以这里有两个查询供你选择,一个返回interval day to second数据类型的值,另一个返回varchar2数据类型的值:

此查询以interval day to second 数据类型的值返回两个日期之间的差异:

SQL> with t1(starttime, endtime, total_time_taken ) as(
  2    select to_date('02-12-2013 01:24:00', 'dd/mm/yyyy hh24:mi:ss')
  3         , to_date('02-12-2013 04:17:00', 'dd/mm/yyyy hh24:mi:ss')
  4         , '02:53:00'
  5     from dual
  6  )
  7  select starttime
  8       , endtime
  9       , (endtime - starttime) day(0) to second(0) as total_time_taken
 10   from t1
 11  ;

结果:

STARTTIME            ENDTIME               TOTAL_TIME_TAKEN  
-----------          -----------          ---------------- 
02-12-2013 01:24:00  02-12-2013 04:17:00   +0 02:53:00        

此查询以varchar2 数据类型的值返回两个日期之间的差异:

SQL> with t1(starttime, endtime, total_time_taken ) as(
  2    select to_date('02-12-2013 01:24:00', 'dd/mm/yyyy hh24:mi:ss')
  3         , to_date('02-12-2013 04:17:00', 'dd/mm/yyyy hh24:mi:ss')
  4         , '02:53:00'
  5     from dual
  6  )
  7  select starttime
  8       , endtime
  9       , to_char(extract(hour   from res), 'fm00')  || ':' ||
 10         to_char(extract(minute from res), 'fm00')  || ':' ||
 11         to_char(extract(second from res), 'fm00') as total_time_taken
 12    from(select starttime
 13              , endtime
 14              , total_time_taken
 15              , (endtime - starttime) day(0) to second(0) as res
 16          from t1
 17        )
 18  ;

结果:

STARTTIME            ENDTIME              TOTAL_TIME_TAKEN  
-----------          -----------          ---------------- 
02-12-2013 01:24:00  02-12-2013 04:17:00   02:53:00 

【讨论】:

    【解决方案2】:

    也试试这个,

    WITH TIME AS (
    SELECT to_date('02-12-2013 01:24:00', 'dd-mm-yyyy hh24:mi:ss') starttime, 
           to_date('02-12-2013 04:17:00', 'dd-mm-yyyy hh24:mi:ss') endTime
    FROM dual)
    SELECT to_char(TRUNC ((endTime - startTime)* 86400 / (60 * 60)), 'fm09')||':'||
           to_char(TRUNC (MOD ((endTime - startTime)* 86400, (60*60)) / 60), 'fm09')||':'||
           to_char(MOD((endTime - startTime)* 86400, 60), 'fm09') time_diff
    FROM   TIME;
    

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2019-04-14
      • 2016-04-18
      • 1970-01-01
      相关资源
      最近更新 更多