Oracle NVL функция не позволяет второй параметр как datetime
select nvl(trunc(null),trunc(sysdate)) from dual;
При выполнении вышеуказанного запроса я получаю следующую ошибку
ORA-00932: inconsistent datatypes: expected NUMBER got DATE
Похоже, когда я беру строку или число вместо trunc(sysdate)
, это работает нормально.
2 ответа:
Из здесь:
Первым параметром для NVL является определение ожидаемого типа данных вернулся колонка, с функции trunc дефолта, что количество потому что это параметр NULL. Второй параметр для NVL должен сопоставьте этот тип данных, которого нет, потому что это дата.
SQL> select nvl(trunc(sysdate), sysdate) as mydate from dual; MYDATE ------------------- 26/05/2006 00:00:00 SQL> select nvl(trunc(null), sysdate) as mydate from dual; select nvl(trunc(null), sysdate) as mydate from dual * ERROR at line 1: ORA-00932: inconsistent datatypes: expected NUMBER got DATE
Или вы можете сделать так:
SELECT NVL(TO_DATE(TRUNC(NULL)),SYSDATE) FROM dual;
Второй параметр должен иметь тот же тип данных, что и первый параметр. Функция
trunc
перегружена. Очевидно, когда вы передаете ему Anull
, он интерпретирует значение как число и возвращает число. Любая из следующих работ:SELECT NVL (NULL, TRUNC (SYSDATE)) FROM DUAL; SELECT NVL (TRUNC (TO_DATE (NULL)), TRUNC (SYSDATE)) FROM DUAL; SELECT NVL (TRUNC (CAST (NULL AS DATE)), TRUNC (SYSDATE)) FROM DUAL;
Продолжение:
Если переменная, которая используется, правильно определена как дата, то у вас не должно быть проблем. Например, без ошибок выполняется следующее:
DECLARE FUNCTION f RETURN DATE IS BEGIN RETURN NULL; END f; BEGIN DBMS_OUTPUT.put_line (NVL (TRUNC (f), TRUNC (SYSDATE))); END;
Чтобы получить ответ, что фактически решает вашу проблему, я бы рекомендовал отредактировать вопрос, чтобы включить код, который действительно демонстрирует проблему.