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