четверг, 12 декабря 2013 г.

Как правильно сложить/вычесть TIMESTAMP в PLSQL в Oracle


Как было с типом DATE

Когда надо было прибавить/отнять какой-то промежуток времени к переменной типа date, то с давних времён я пользовался обычным математическим преобразованием, исходя из того, что "1" - это 1 сутки = 24 часам = ...
 Например:

 declare
   vDate date default sysdate;
 begin
   -- прибавить vIntervalSec секунд
   vDate := vDate + 1/(24*60*60);
 end;

Что случилось с timestamp

Когда пришло время выполнить такую же операцию с переменной типа timestamp, то я поступил так же, и внешне всё сработало успешно...НО.... проблема обнаружилась, когда понадобилось поработать с миллисекундами. Выяснилось, что при таком типе преобразований, тип timestamp усекается до типа date

 declare
    vTS timestamp default = systimestamp;
  begin
    -- НЕЛЬЗЯ ТАК ДЕЛАТЬ !!!
    -- секунды прибавляются, НО миллисекунды стали =0 !!!
    vTS := vTS + 1/(24*60*60);
  end;

Решение

Для операций сложения/вычитания timestamp в PLSQL в Oracle надо использовать тип INTERVAL. И функции, которые работают с ним,например NUMTODSINTERVAL :

 declare
    vTS timestamp default systimestamp;
    vIntervalSec integer default 30;
  begin
    -- ПРАВИЛЬНО
    -- прибавим 30 секунд
    vTS := vTS + NUMTODSINTERVAL(v_attemptInterval, 'SECOND');
 end;



Комментариев нет:

Отправить комментарий