时间减法格式结果

时间:2017-08-09 19:06:55

标签: oracle time format

我无法格式化时间计​​算结果以及搜索论坛解决方案。我不希望查看“UTC的小时数”导致结果(+09)。

select
(localtimestamp - to_timestamp(us.STARTDATETIME,'hh24:mi:ss')) as HoursPassed
from random us

其中us.STARTDATETIMEvarchar2,其中08:00

我的结果:

  

+09 07:30:17.160826

期望的结果:

  

7点30分17秒

1 个答案:

答案 0 :(得分:1)

当您subtract one timestamp from another结果是内部间隔数据类型时,您可以将其视为'interval day to second'

select
(localtimestamp - to_timestamp(us.STARTDATETIME,'hh24:mi:ss')) as HoursPassed
from random us;

HOURSPASSED        
-------------------
+08 15:26:54.293892

'+ 08'(在我的会话时区)是天数,而不是UTC偏移量;这是它的值,因为当您将字符串转换为日期或时间戳并仅提供时间部分时,日期部分defaults to the first day of the current month

  

默认日期值的确定如下:

     
      
  • 年份是当前年份,由SYSDATE返回。
  •   
  • 月份是当前月份,由SYSDATE返回。
  •   
  • 当天是01(本月的第一天)。
  •   
  • 小时,分钟和秒均为0。
  •   
     

这些默认值用于请求未指定日期的日期值的查询...

所以我真的在比较:

select localtimestamp, to_timestamp(us.STARTDATETIME,'hh24:mi:ss')
from random us;

LOCALTIMESTAMP             TO_TIMESTAMP(US.STARTDATET
-------------------------- --------------------------
2017-08-09 23:26:54.293892 2017-08-01 08:00:00.000000

您不能直接格式化间隔,但您可以extract时间元素并单独格式化它们,并将它们连接起来。

select to_char(extract(hour from (localtimestamp
    - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
  ||':'|| to_char(extract(minute from (localtimestamp
    - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
  ||':'|| to_char(extract(second from (localtimestamp
    - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
  as hourspassed
from random us;

HOURSPASSED
-----------
15:26:54

反复计算相同的间隔看起来有点浪费且难以管理,因此您可以在内联视图或CTE中执行此操作:

with cte (diff) as (
  select localtimestamp - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss')
  from random us
)
select to_char(extract(hour from diff), 'FM00')
  ||':'|| to_char(extract(minute from diff), 'FM00')
  ||':'|| to_char(extract(second from diff), 'FM00')
  as hourspassed
from cte;

HOURSPASSED
-----------
15:26:54

您还可以使用日期而不是时间戳;减法然后给出差异作为数字,整数和分数天:

select current_date - to_date(us.STARTDATETIME, 'hh24:mi') as hourspassed
from random us;

HOURSPASSED
-----------
 8.64368056

格式化的最简单方法是将其添加到已知的午夜时间,然后使用to_char()

select to_char(date '1970-01-01'
  + (current_date - to_date(us.STARTDATETIME, 'hh24:mi')),
  'HH24:MI:SS') as hourspassed
from random us;

HOURSPAS
--------
15:26:54

我坚持current_datelocaltimestamp最匹配;您实际上可能需要systimestamp和/或sysdate。 (更多关于差异here。)