Как добавить одну наносекунду к переменной типа timestamp?
Я пытаюсь добавить одну наносекунду к переменной типа timestamp, но безуспешно.
Вот пример кода:
DECLARE
nextTimestamp TIMESTAMP := TO_TIMESTAMP('11-11-2020 22:10:10.111111111');
BEGIN
nextTimestamp := nextTimestamp + 1 / (10000000*60*60*24);
END;
Есть идеи, как можно это сделать?
Свободный перевод вопроса How to add one nanosecond to a timestamp in PL/SQL от участника @Winter
Ответы (1 шт):
Литерал interval day to second можно использовать для добавления дробных секунд к значению timestamp.
В этом примере добавляем одну наносекунду:
select timestamp '2020-11-11 22:10:10.111111111' +
interval '0 00:00:00.000000001' day to second (9) as res
from dual
/
RES
-----------------------------
2020-11-11 22:10:10,111111112
На заметку: Когда используется функция to_timestamp(), то надо указать маску формата, а не полагаться на настройки NLS:
select
to_timestamp ('11-11-2020 22:10:10:111111111', 'dd-mm-yyyy hh24:mi:ss:ff9') +
interval '0 00:00:00.000000001' day to second (9) as res
from dual
Надо учесть: Поскольку обработка предполагается в PL/SQL, то надо учесть следующее: по умолчанию точность дробных секунд для значений типа данных timestamp в PL/SQL равна 6, а не 9, как в SQL. Поэтому, можно ожидать усечения дробных секунд. Чтобы избежать этого, используйте типы данных timestamp_unconstrained и dsinterval_unconstrained вместо timestamp и interval day to second:
declare
ts timestamp_unconstrained :=
to_timestamp ('11-11-2020 22:10:10:111111111', 'dd-mm-yyyy hh24:mi:ss:ff9');
ns dsinterval_unconstrained := interval '0.000000001' second;
begin
ts := ts + ns;
dbms_output.put_line (to_char(ts, 'dd-mm-yyyy hh24:mi:ss:ff9'));
end;
/
11-11-2020 22:10:10:111111112
Свободный перевод ответа от участника @Nick Krasnov