【发布时间】:2017-07-19 06:56:11
【问题描述】:
我有几个时间字段是 INTERVAL DAY(0) TO SECOND(0) 数据类型来存储一天中的不同时间。
目前在正常检索时,我的字段显示如下:
+00 19:00:00.000000
我怎样才能将其格式化为显示为 19:00?
【问题讨论】:
标签: sql oracle oracle11g oracle10g
我有几个时间字段是 INTERVAL DAY(0) TO SECOND(0) 数据类型来存储一天中的不同时间。
目前在正常检索时,我的字段显示如下:
+00 19:00:00.000000
我怎样才能将其格式化为显示为 19:00?
【问题讨论】:
标签: sql oracle oracle11g oracle10g
您需要间隔中的小时和分钟。如果该间隔不能超过 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
【讨论】:
与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' 填充它们。
【讨论】:
使用
substr(to_char(interval_value), 5, 5)
其中interval_value 是列名(顺便提一下,关系数据库中的表没有字段;它们确实有列)。
【讨论】: