格式化时间戳输出

时间:2014-07-02 15:29:59

标签: oracle timestamp

我的COMPLETION_DATETIMESTART_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

如何摆脱前导零?

2 个答案:

答案 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;