【问题标题】:Formatting INTERVAL DAY(0) TO SECOND(0)将 INTERVAL DAY(0) 格式化为 SECOND(0)
【发布时间】:2017-07-19 06:56:11
【问题描述】:

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

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

+00 19:00:00.000000

我怎样才能将其格式化为显示为 19:00?

【问题讨论】:

    标签: sql oracle oracle11g oracle10g


    【解决方案1】:

    您需要间隔中的小时和分钟。如果该间隔不能超过 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
    

    【讨论】:

    • 间隔不应 >= 24 小时; OP 说他们使用这种数据类型存储一天中的不同时间
    【解决方案2】:

    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' 填充它们。

    【讨论】:

    • 不应有负区间。 OP 说他们使用这种数据类型存储一天中的不同时间
    【解决方案3】:

    使用

    substr(to_char(interval_value), 5, 5)
    

    其中interval_value 是列名(顺便提一下,关系数据库中的表没有字段;它们确实有列)。

    【讨论】:

    • 似乎不起作用。它向我抛出“字符串对于内部缓冲区来说太长”异常
    • @ABB25 - ?你在运行什么代码?该错误并非源自我在解决方案中所写的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2018-10-09
    • 2019-09-15
    相关资源
    最近更新 更多