ORA-06502: PL / SQL: числовая ошибка или ошибка значения: буфер символьной строки слишком мал в запросе Oracle sql

#sql #oracle #date #difference

#sql #Oracle #Дата #разница

Вопрос:

Я хочу вычислить разницу во времени между двумя датами в sql-запросе Oracle. Я написал следующий запрос:

 DECLARE
 v_time varchar2(40); 
 diff_hours varchar2(40); 
 BEGIN
 select substr(((select date_time from observation_measurement where observation_measurement_id=2861971)), 1,17)
 into v_time
 from dual;

 dbms_output.put_line(v_time);

 select 24 * (to_date('06-25-2014 09:46:36', 'MM-DD-YYYY hh24:mi:ss') 
             - to_date(v_time, 'YY-MM-DD hh24:mi:ss')) into diff_hours 
       from dual;
END;
 

Первый оператор select возвращает правильный результат. Когда я пытаюсь вычислить разницу во времени с текущей даты на предыдущую расчетную дату, она показывает ошибку. Как я могу получить правильный результат?

Спасибо!!!!

Комментарии:

1. вы пробовали после увеличения размера переменной diff_hours ?

2. Потрясающе. Увеличение размера diff_hours работает. Я этого не заметил. Спасибо 🙂

Ответ №1:

Увеличение размера рабочей переменной diff_hours. Спасибо, Кришна. 🙂

Ответ №2:

Сделайте diff_hours NUMBER переменную вместо VARCHAR2 переменной!

Конечно, вы можете сделать diff_hours достаточно долго, чтобы удерживать все незначительные десятичные дроби, которые выдает ваш запрос, но объявлять это VARCHAR2 в любом случае бессмысленно!

Ответ №3:

Привет, я внес некоторые исправления в ваш запрос. Скажите мне, работает ли это

 DECLARE
 v_time varchar2(40);
-- Increase the size  
 diff_hours varchar2(200); 
 BEGIN
 select substr(((select date_time from observation_measurement where observation_measurement_id=2861971)), 1,17)
 into v_time
 from dual;

 dbms_output.put_line(v_time);
-- using the same format mask for both the dates
 select 24 * (to_date('06-25-2014 09:46:36', 'MM-DD-YYYY hh24:mi:ss') 
             - to_date(v_time, 'MM-DD-YYYY hh24:mi:ss')) into diff_hours 
       from dual;
END;
 

Ответ №4:

Вы можете увеличить diff_hours, и это может сработать в некоторых случаях, но проблема в том, что в других случаях это может не сработать.

Чтобы быть уверенным, вам нужно явно преобразовать число в строку (пример с 2 цифрами после точки):

 select trunc(24*...., 2) into diff_hours