Преобразовать целое число в часы и минуты - получить числовое значение PL/SQL или ошибку значения

я осознаю

ORA-06502 Ошибка числа или значения PL/SQL

когда я пытаюсь выполнить этот оператор из Report Builder 6i и базы данных Oracle 11g.

select to_char(to_date(lateby, 'sssss'), 'mi:ss') 
from attendancelogs   
where emp_no = :emp_no 
  and attendancedate = :dat;

late    number(15);

Тот же оператор при запуске под SQL * Plus работает нормально, без ошибок и извлекает значения так, как я хочу.

Любая помощь будет высоко ценится.

С уважением, Мак


person Macky    schedule 04.11.2018    source источник
comment
Ох, какие странные данные вы храните в этой колонке; значение даты, хранящееся в столбце типа данных NUMBER, все в формате 'sssss'. Я никогда не видел ничего подобного. В любом случае: что возвращает этот оператор SELECT, когда вы запускаете его в SQL*Plus? Не могли бы вы опубликовать соответствующие образцы данных из таблицы ATTENDANCELOGS? Где вы выполняете этот запрос в построителе отчетов? Как основной запрос отчета? Или это столбец формулы или что-то в этом роде? Если да, правильно ли установлена ​​переменная, которую вы использовали (ее тип данных должен быть как минимум VARCHAR2(5))?   -  person Littlefoot    schedule 04.11.2018
comment
Спасибо за ваш ответ ... Я запускаю его как столбец формулы в построителе отчетов, переменная (lateby) представляет собой числовой тип данных в таблице, которая содержит целое число, которое представляет, на сколько минут опаздывает сотрудник.   -  person Macky    schedule 04.11.2018
comment
Я запускаю его как столбец формулы в построителе отчетов, переменная (опоздание) представляет собой числовой тип данных в таблице, которая содержит целое число, которое представляет, на сколько минут опаздывает сотрудник. Ниже приведен вывод из sql plus.   -  person Macky    schedule 04.11.2018
comment
выберите Laterby, to_char(to_date(lateby, 'sssss'), 'mi:ss') из журналов посещаемости, где emp_no = 52 LATEBY TO_CH 00:00 0 00:00 533 08:53 532 08:52   -  person Macky    schedule 04.11.2018
comment
любая помощь, пожалуйста...   -  person Macky    schedule 04.11.2018
comment
Пожалуйста, отредактируйте исходное сообщение и опубликуйте SELECT (и его результат) в вопросе; это нечитаемо, если вы опубликуете это как комментарий. Хотя кажется, что столбец LATEBY имеет такие значения, как 00:00 или 08:53 - если это так, то это определенно не числовой тип данных, а символ. Помогите нам помочь вам; опубликовать описание таблицы, ее содержимое (несколько строк), весь код столбца формулы. Если вы продолжаете публиковать фрагменты и разбрасывать их по комментариям здесь и в ответах ниже, сложно понять, что у вас есть на самом деле и что вы хотите получить.   -  person Littlefoot    schedule 04.11.2018
comment
Может быть, попробовать lateby * INTERVAL '1' SECOND и потом отформатировать результат?   -  person Wernfried Domscheit    schedule 04.11.2018


Ответы (1)


Это может быть ошибка отчетов, я не знаю, но в качестве обходного пути вы можете попробовать обернуть это в хранимую процедуру в базе данных следующим образом:

CREATE OR REPLACE FUNCTION sssss_to_miss ( p1 in varchar2 ) RETURN VARCHAR2 IS
BEGIN
   RETURN ( to_char(to_date(p1, 'sssss'), 'mi:ss') );
END;
/

Затем в коде отчетов:

select sssss_to_miss (lateby) 
from attendancelogs   
where emp_no = :emp_no 
  and attendancedate = :dat;

late    number(15);

В качестве альтернативы что-то вроде (не проверено):

select to_char(to_number(lateby)/60,'00') || ':' || to_char(mod(to_number(lateby),60),'00') 
    from attendancelogs   
    where emp_no = :emp_no 
      and attendancedate = :dat;
person TenG    schedule 04.11.2018
comment
Не могли бы вы проверить обрабатываемое значение lateby, чтобы убедиться, что нет мошеннического значения, отличного от формата 'SSSSS'. - person TenG; 04.11.2018
comment
Я проверил это, значение Laterby представляет собой только трехзначное целое число. Это числовой столбец, который также не содержит нуля. Он содержит только значения от 0 до 999. - person Macky; 04.11.2018
comment
любое предложение, пожалуйста .. высоко ценится - person Macky; 04.11.2018
comment
Вы пробовали подход server FUNCTION? Какова цель объявления переменной late в вашем коде? Не могли бы вы попробовать дополнить значение lateby начальным 0, чтобы его общая длина была равна 5 (чтобы соответствовать SSSSS)? - person TenG; 04.11.2018
comment
Нет, я еще не пытался создать хранимую процедуру ... но я попытаюсь это сделать ... цель переменной опоздания - это целое число, которое сообщает, на сколько минут опаздывает сотрудник. Я хочу преобразовать это целое число в часы:минуты:секунды для отображения в отчете, а не просто целочисленное значение. - person Macky; 04.11.2018
comment
Я попытался создать функцию из жабы, она дает мне «IN» не целочисленное значение, когда я пытался скомпилировать. - person Macky; 04.11.2018
comment
Итак, измените тип IN с VARCHAR2 на NUMBER. - person TenG; 04.11.2018
comment
Я создал функцию, но она выдает ту же ошибку, когда я запускаю отчет из построителя отчетов ... не понимаю, где находится исправление ... вы предлагаете что-нибудь еще, что я попробую ... спасибо в adv. - person Macky; 05.11.2018
comment
Можете ли вы предложить какой-либо другой способ преобразования целого числа в часы:минуты:секунды, пожалуйста? Ценю твою помощь - person Macky; 05.11.2018
comment
Можете ли вы дать мне знать, как я могу проверить файлы журнала на наличие этой ошибки.. будет ли какая-либо запись об этой ошибке в файле журнала.. спасибо - person Macky; 05.11.2018
comment
Получите значение :emp_no и :dat, используемое в запросе отчета. Затем используйте эти значения в том же запросе в SQLPLUS, но также распечатайте значение lateby, чтобы мы могли видеть, что представляет собой входное значение. Нам нужно точно указать, какое значение передается. Фактически, опубликуйте результаты SELECT lateby, dump(lateby) FROM attendancelogs where emp_no = XXXX attendancedate = YYYYY. - person TenG; 05.11.2018
comment
я позже изменил тип данных этой переменной, которая была определена как число, на varchar2 в отчете и удалила итог для этого столбца.. теперь он работает.. но мне нужно знать, как я могу сделать итог для этого столбца сейчас... Спасибо за вашу поддержку - person Macky; 06.11.2018