遵循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?
答案 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')!