格式化INTERVAL DAY(0)到第二个(0)

时间:2017-07-19 06:56:12

标签: sql oracle oracle11g oracle10g

我有几个时间字段是INTERVAL DAY(0)到SECOND(0)数据类型存储一天中的不同时间。

目前在正常检索时,我的字段显示如下:

+00 19:00:00.000000

我如何格式化,以便显示为19:00?

3 个答案:

答案 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