Почему сумма чисел взятых из строчных значений после 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 шт):

Автор решения: 0xdb

Обьявление типа колонки 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    
→ Ссылка