Почему сумма чисел взятых из строчных значений после SUBSTR округляется?
Хочу перевести строчку TAH_START (VARCHAR2) из формата времени в часах:минутах в число TAH_START_NUM (NUMBER(19)).
Например, 08:56 надо представить как 08 + 56/60 = 8.93333333.
Я попробовал так:
UPDATE TEST_TABLE
SET TAH_START_NUM = substr(TAH_START, 1, 2) + (substr(TAH_START, 4, 2) / 60)
После выполнения данные выглядят так:
16:21 16
08:24 8
08:47 9
...
05:35 6
Но результат не выглядит как ожидалось, думаю, проблема в строчном формате чисел.
Ответы (1 шт):
Обьявление типа колонки NUMBER(19) это укороченная форма записи NUMBER(19,0).
Что произойдёт, если эти значения будут превышены? Коротко из оф. документации:
NUMBER(p,s)
- p is the precision ...
- s is the scale ...
[...]
If a value exceeds the precision, then Oracle returns an error. If a value exceeds the scale, then Oracle rounds it.
Значение будет округленно. Решением будет, или отказаться от ограничения вообще, или указать для него разумные значения соглано тех. заданию. Например:
create table t1 (val varchar2 (5), num number (19));
insert into t1 (val)
select trim (column_value)
from xmlTable ('"08:56", "16:21"');
update t1
set num = substr (val, 1, 2) + (substr (val, 4, 2) / 60);
select * from t1;
VAL NUM
----- ----------
08:56 9
16:21 16
rollback;
alter table t1 modify (num number (6,4));
Повторите вставку и обновление, и вывод результата теперь ожидаемый:
VAL NUM
----- ----------
08:56 8,9333
16:21 16,35