我的COMPLETION_DATETIME
和START_DATETIME
类型为:timestamp。
SELECT (COMPLETION_DATETIME - START_DATETIME) INTO model_load_time FROM "COUNT_STATISTICS" where "MODEL" = todays_model;
以上查询返回:
XCOMPASS loaded in: +000000000 05:19:24.180022
如何摆脱前导零?
答案 0 :(得分:2)
两个时间戳之间的差异是一个时间间隔,您可以像日期和时间戳一样轻松地格式化这些时间戳 - 例如,您不能使用to_char
。我假设这是在PL / SQL块中,model_load_time
被声明为varchar2
,并且您正在使用dbms_output
来显示。
在这种情况下,您可以使用正则表达式从日期部分中删除前导+/-和零,同时保留时间部分:
regexp_replace(model_load_time, '^[+-]?[0]*[ ]?'));
作为测试:
set serveroutput on
declare
model_load_time varchar2(40);
begin
/*
SELECT (COMPLETION_DATETIME - START_DATETIME)
INTO model_load_time
FROM "COUNT_STATISTICS"
where "MODEL" = todays_model;
*/
-- dummy to get same interval
select systimestamp - (systimestamp
- numtodsinterval((60*60*5) + (60*19) + 24.180022, 'SECOND'))
into model_load_time
from dual;
dbms_output.put_line('XCOMPASS loaded in: ' || model_load_time);
dbms_output.put_line('XCOMPASS loaded in: '
|| regexp_replace(model_load_time, '^[+-]?[0]*'));
dbms_output.put_line('XCOMPASS loaded in: '
|| regexp_replace(model_load_time, '^[+-]?[0]*[ ]?'));
end;
/
产地:
anonymous block completed
XCOMPASS loaded in: +000000000 05:19:24.180022000
XCOMPASS loaded in: 05:19:24.180022000
XCOMPASS loaded in: 05:19:24.180022000
这保留了“小时”的前导零点。数;一个版本也保留了通常在天数和小时之间的空间,但我怀疑你真的不想要那个。如果间隔超过一天,那么它仍然会显示天数,而没有前导零:
XCOMPASS loaded in: 1 05:19:24.180022000
我认为可以安全地假设您的完成永远不会在您开始之前,因此您不必担心负面间隔。如果您确定间隔时间不会超过一天,则可以使用substr
代替:
dbms_output.put_line('XCOMPASS loaded in: ' || substr(model_load_time, 12));
...但我认为正则表达式更安全吗?
另一种解决方法是使用extract()
,但这有点啰嗦;它确实为您提供了更多控制权,并允许您将超过一天的值显示为30小时,例如。
答案 1 :(得分:1)
检查一下
SELECT substr(CAST((systimestamp - systimestamp)
AS INTERVAL DAY(1) TO SECOND(3)),4) Result
FROM dual;