2015-12-07 12 views
-1

Мне нужно найти количество дней между двумя датами.разница между двумя датами

Вот код:

declare 
datum DATE; 
sdate DATE; 
shpord NUMBER; 
rozdiel NUMBER; 
MESSAGE VARCHAR(2000) := 'Nemozete Uvolnit VO c.'; 

begin 
datum := TO_DATE('&OLD:NEED_DATE','DD.MM.YYYY'); 
sdate := TO_DATE(sysdate,'DD.MM.YYYY'); 

rozdiel := datum - sdate; 
IF rozdiel > 5 THEN 
    ERROR_SYS.Record_General('Nemozete Uvolnit VO c',''); 
END IF; 
end; 

Я получаю сообщение об ошибке:

ORA-01858: a non-numeric character was found where a numeric was expected

+1

@Consider в будущем, пожалуйста, также вычеркивать Спасибо и другой подобный шум. Это сделает ваши предложенные изменения более полными. – ryanyuyu

+2

** Не **: 'sdate: = TO_DATE (sysdate, 'DD.MM.YYYY');'. 'sysdate' ** уже дата **. Ваш код принимает 'sysdate' и неявно преобразует его в строку, потому что' to_date' принимает строку. Формат, используемый для неявного преобразования, основан на 'NLS_DATE_FORMAT'. Затем 'to_date' переводит эту строку обратно к дате. И если NLS_DATE_FORMAT' не соответствует строке, указанной вами для возврата к дате, округление до строки и обратно приведет либо к ошибке, либо к неправильному результату. –

+1

Вызов 'to_date()' значения 'date', чтобы преобразовать его в' date', является неправильным. –

ответ

0

Изменить эту строку:

sdate := TO_DATE('sysdate','DD.MM.YYYY'); 

к:

sdate := sysdate; 

Вы пытаетесь преобразовать STRID 'sysdate' в дату, а не результат функции sysdate.

также, смотрите настройки nls, если формат даты не установлен на «dd.mm.yyyy», вы получите ошибку.

+0

Здравствуйте, да из корня, но с той же ошибкой. есть проблема, я думаю, с разными типами данных. но я не знаю, где. – denn

+0

ineed as ressult a NUMBER. – denn

+0

@denn: он работает для меня, как только я исправлю проблему «sysdate» ... поэтому, если вы все еще получаете ошибку, покажите полный скрипт, покажите полную ошибку ..., чтобы мы могли видеть, какая ошибка/где это происходит. (и показать полный ввод тоже :)) – Ditto

3

Не звоните to_date на дату. sysdate уже есть date. Если вы хотите, чтобы вычесть полночь на текущий день от datum

declare 
    datum DATE; 
    sdate DATE; 
    shpord NUMBER; 
    rozdiel NUMBER; 
    MESSAGE VARCHAR(2000) := 'Nemozete Uvolnit VO c.'; 
begin 
    datum := TO_DATE('&OLD:NEED_DATE','DD.MM.YYYY'); 
    sdate := trunc(sysdate); 

    rozdiel := datum - sdate; 
    IF rozdiel > 5 THEN 
    ERROR_SYS.Record_General('Nemozete Uvolnit VO c',''); 
    END IF; 
end; 
Смежные вопросы