Лучший вариант: перезагрузить данные из оригинального источника, после того, как вы исправите свой код.
Если у вас больше нет доступа к исходным данным, и вы должны исправить все это на месте, используйте инструкцию UPDATE ниже (показана в контексте):
create table tbl ( ts timestamp );
insert into tbl ( ts ) values ( timestamp '2018-06-26 11:15:43.0950' );
commit;
select ts from tbl;
TS
----------------------------------------
2018-06-26 11.15.43.095000000
update tbl set ts = ts + 9 * (ts - cast(ts as timestamp(0)));
1 row updated.
commit;
select ts from tbl;
TS
----------------------------------------
2018-06-26 11.15.43.950000000
Объяснение:
Если исходная временная метка имела форму X + w
, где X
— это целые секунды, а w
— дробная часть секунды, текущее значение равно X + z
, где z = w/10
. (Вы добавили ошибочную цифру 0
сразу после запятой, что означает, что вы разделили w
на десять). Итак: сейчас у вас X + z
, но вы хотите X + w
, или, другими словами, X + 10 * z
. Итак, вы должны добавить 9 * z
к тому, что у вас уже есть.
Чтобы получить z
(дробная часть метки времени), вам нужно вычесть X
(целая часть) из метки времени. X
само по себе является усечением метки времени до целых секунд. Нет функции TRUNC()
для усечения до целых секунд, но функция CAST
до TIMESTAMP(0)
делает эту работу достаточно хорошо.
Чтобы использовать ваши образцы данных: X
— это временная метка '2018-06-26 11:15:43.000000'
. Это также результат cast(ts as timestamp(0))
. w
— это .9500
, а z
— это то, что попало в вашу таблицу, .0950
. Ваше текущее значение X + z
, но вы хотите X + w
. Это X + 10 * z = (X + z) + 9 * z
, а теперь помните, что (X + z)
— это всего лишь ts
(значение, которое вы имеете в таблице на данный момент), поэтому вам нужно всего лишь добавить девять раз значение z
, которое составляет разницу (ts - X)
.
person
mathguy
schedule
26.02.2018