格式间隔为to_char

时间:2009-06-09 14:00:46

标签: sql oracle intervals

遵循SQL命令

select TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))) from table1

生成以下格式的结果:+000000000 00:03:01.954000。

是否可以在to_char函数中输入特殊格式以获取 格式的结果:+00 00:00:00.000?

6 个答案:

答案 0 :(得分:18)

如果你想要更低的精度,你可以投射结果:

SQL> SELECT TO_DSINTERVAL('10 10:00:00') t_interval FROM dual;

T_INTERVAL
-----------------------------------------------------------
+000000010 10:00:00.000000000

SQL> SELECT CAST(TO_DSINTERVAL('10 10:00:00')
  2                 AS INTERVAL DAY(2) TO SECOND(3)) t_interval
  3    FROM dual;

T_INTERVAL
-----------------------------------------------------------
+10 10:00:00.000

编辑以下OP评论:

来自Oracle Documentation (11gr1)

  

Interval数据类型没有格式模型。因此,要调整它们的表示,必须组合字符函数,如EXTRACT和连接组件。

您似乎必须手动使用EXTRACT来实现所需的输出:

SQL> SELECT to_char(extract(DAY FROM t_interval), 'fmS99999') || ' ' ||
  2         to_char(extract(HOUR FROM t_interval), 'fm00') || ':' ||
  3         to_char(extract(MINUTE FROM t_interval), 'fm00') || ':' ||
  4         to_char(extract(SECOND FROM t_interval), 'fm00.000')
  5    FROM (SELECT TO_DSINTERVAL('10 01:02:55.895') t_interval FROM dual)
  6  ;

TO_CHAR(EXTRACT(DAYFROMT_INTER
------------------------------
+10 01:02:55.895

这不是很优雅,但它似乎是处理微秒精度的唯一方法。

答案 1 :(得分:8)

to_char()似乎有固定的格式:(所以regexp_substr可能是一个选项,例如:

SELECT regexp_substr (TO_DSINTERVAL ('10 10:00:00'), '\d{2} \d{2}:\d{2}:\d{2}\.\d{3}') t_interval FROM dual

答案 2 :(得分:4)

我意识到它根本不聪明,也不是你正在寻找的特殊格式字符串,但这个答案确实有效,因为输出是固定的长度:

SELECT    SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 1, 1)
       || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 9, 2)
       || ' '
       || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 12, 12)
  FROM table1;

它也只是截断小数秒而不是舍入,但我假设从你的例子中他们都只是零。

这是一个更大的尴尬,但我无法抗拒:

SELECT SUBSTR(REPLACE(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00')))
                     , '0000000', '')
             , 1, 16)
  FROM table1;

答案 3 :(得分:2)

线程坏死的轻微情况,但我在搜索如何格式化间隔时遇到了这个问题,所以我认为值得添加此评论。

Oracle documentation开始,为时间戳添加时间戳会产生时间戳,因此通过添加具有零时间元素的常量时间戳,您可以使用标准to_char format elements作为日期时间... < / p>

SELECT TO_CHAR( TIMESTAMP'1969-12-31 00:00:00' + TO_DSINTERVAL('0 00:03:01.954321'),
  'HH24:MI:SS.FF3' ) FROM dual;

然而,如果您的间隔可能超过一天,则会出现问题。没有格式元素的天数将产生0.“DDD”是一年中的某一天,因此在上面的示例中将是365,如果间隔大于一天,则为1或更多。只要你的间隔小于24小时就可以了。

应该添加11g,因此可能不适用于OP。

答案 4 :(得分:0)

您可以使用正则表达式删除最后一部分(或任何部分) Oracle REGEXP_REPLACE就是这样做的。

从table1中选择REGEXP_REPLACE(TO_CHAR(NVL(arg1 - arg2,TO_DSINTERVAL(&#39; 0 00:00:00&#39;))),&#39; .. *&#39;)

答案 5 :(得分:0)

SELECT W.SHIFT_NUMB || ' c: ' ||
       TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMEFROM, 'HH24:MI') ||
       ' по: ' ||
       TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMETO, 'HH24:MI'),
       w.ID
  FROM AC_WORK_SHIFT W
 WHERE W.CLIENT_ID = GC

只需添加日期并使用to_char('HH24:MI')!