格式间隔为to_char

Geo*_*ber 7 sql oracle intervals

遵循SQL命令

select TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))) from table1
Run Code Online (Sandbox Code Playgroud)

生成格式的结果:+000000000 00:03:01.954000.

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

Vin*_*rat 20

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

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
Run Code Online (Sandbox Code Playgroud)

编辑以下OP注释:

来自Oracle文档(11gr1):

间隔数据类型没有格式模型.因此,要调整其表示,必须组合字符函数,如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
Run Code Online (Sandbox Code Playgroud)


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


小智 9

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
Run Code Online (Sandbox Code Playgroud)


Ste*_*erg 5

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

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;
Run Code Online (Sandbox Code Playgroud)

它还只是截断秒的小数部分而不是四舍五入,但我认为从你的例子来看它们都只是零。

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

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