Как было с типом 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;
Комментариев нет:
Отправить комментарий