我有几个时间字段是INTERVAL DAY(0)到SECOND(0)数据类型存储一天中的不同时间。
目前在正常检索时,我的字段显示如下:
+00 19:00:00.000000
我如何格式化,以便显示为19:00?
答案 0 :(得分:1)
使用
substr(to_char(interval_value), 5, 5)
其中interval_value
是列名称(顺便说一下,关系数据库中的表没有字段;它们确实有列)。
答案 1 :(得分:0)
与documentation相反,您不能将函数TO_CHAR()
用于间隔。它允许使用INTERVAL值,但结果始终相同。在另一个地方documentation说:
间隔数据类型没有格式模型。
您可以使用EXTRACT()功能,也可以使用正则表达式:
WITH t AS
(SELECT INTERVAL '19' HOUR + INTERVAL '30' MINUTE AS i FROM dual)
SELECT
LPAD(EXTRACT(HOUR FROM i), 2, '0')||':'||LPAD(EXTRACT(MINUTE FROM i), 2, '0'),
REGEXP_SUBSTR(i, '\d{2}:\d{2}')
FROM t;
通常在日期/时间值上使用正则表达式并不是很聪明。另一方面,由于INTERVAL
的格式不依赖于任何NLS设置,因此这是一个可行的选择。
EXTRACT
的缺点是当您有负间隔时。这样的间隔将写成-19:-30
,因为每个组件都带有减号( - )。另请注意,EXTRACT
会返回NUMBER
个值,因此您必须使用' 0'手动
答案 2 :(得分:0)
你想要一个间隔的小时和分钟。如果该间隔不能超过24小时,则可以将间隔添加到没有时间部分的日期,然后使用TO_CHAR
来获取格式化的小时和分钟:
select to_char(trunc(sysdate) + myinterval, 'hh24:mi') from mytable
但是,如果间隔可能更大(例如100小时15分钟:100:15),那么您需要采用另一种方法:
select
to_char(extract (day from myinterval) * 24 + extract (hour from myinterval)) ||
':' ||
to_char(extract (minute from myinterval), 'fm00')
from mytable