我无法格式化时间计算结果以及搜索论坛解决方案。我不希望查看“UTC的小时数”导致结果(+09)。
select
(localtimestamp - to_timestamp(us.STARTDATETIME,'hh24:mi:ss')) as HoursPassed
from random us
其中us.STARTDATETIME
是varchar2
,其中08:00
我的结果:
+09 07:30:17.160826
期望的结果:
7点30分17秒
答案 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_date
与localtimestamp
最匹配;您实际上可能需要systimestamp
和/或sysdate
。 (更多关于差异here。)