изображение формата даты заканчивается перед преобразованием всей входной строки ошибка

У меня такая процедура:

create or replace Procedure return_rows_LECTURE_BY_DATE (in_date in date, out_cursor OUT SYS_REFCURSOR) As

Begin
     OPEN out_cursor for
     select *
     FROM COURSE_LECTURE
     WHERE LECT_DATE_TIME_START >= to_timestamp(in_date, 'dd-mm-yyyy')
     and       LECT_DATE_TIME_START < to_timestamp(in_date+1, 'dd-mm-yyyy')
    ORDER BY LECT_DATE_TIME_START;
End;

ввод: дата, вывод: лекции на эту дату. Даты в таблице (просмотре) - TIMESTAMP.

Я хочу запустить эту процедуру. Я пробовал это:

declare 
k SYS_REFCURSOR;
--t DATE:= to_date('2010-12-14:09:56:53', 'YYYY-MM-DD:HH24:MI:SS') ;
res COURSE_LECTURE%rowtype; 
begin
return_rows_LECTURE_BY_DATE(to_date('2010-12-14', 'YYYY-MM-DD'),k);
loop
  FETCH  k into res;
  Exit when k%notFound;
  DBMS_OUTPUT.PUT_LINE(res.COURSE_NAME );
  end loop;
end;

Но у меня такая ошибка:

Отчет об ошибке - ORA-01830: изображение формата даты заканчивается перед преобразованием всей входной строки ORA-06512: в "HR.RETURN_ROWS_LECTURE_BY_DATE", строка 4 ORA-06512: в строке 6 01830. 00000 - "изображение формата даты заканчивается перед преобразованием всей входной строки "


person user3868442    schedule 25.07.2014    source источник


Ответы (2)


Вы конвертируете дату в метку времени, используя TO_TIMESTAMP(), который принимает символ в качестве параметра. Вместо этого вам следует использовать CAST(), который преобразует один тип данных к другому; например:

WHERE LECT_DATE_TIME_START >= CAST(in_date AS TIMESTAMP)

Вы должны делать это со всеми вашими преобразованиями из дат в метки времени; поэтому to_timestamp(in_date+1, 'dd-mm-yyyy') становится CAST((in_date + 1) AS TIMESTAMP).

person paubo147    schedule 25.07.2014
comment
Подскажите, пожалуйста, где? Я не понимаю. - person user3868442; 25.07.2014
comment
Это помощь! Это работа! но я буду использовать @Maksim Sirothkin, потому что я не знаю, что такое CAST. Спасибо за вашу помощь. - person user3868442; 25.07.2014
comment
Это нелепая причина @ user3868442; особенно когда это правильный ответ. Если вы чего-то не знаете, поищите это в документацию. - person Ben; 25.07.2014

Проблема заключается в том, что с оператором to_timestamp (in_date, 'dd-mm-yyyy') предоставленный формат слишком короткий, вы можете использовать его без каких-либо условий формата to_timestamp (in_date).

person Maksim Sirotkin    schedule 25.07.2014
comment
Это неверно и основано на неявном преобразовании, результаты которого могут изменяться от сеанса к сеансу. - person Ben; 25.07.2014