Oracle NVL функция не позволяет второй параметр как datetime


select nvl(trunc(null),trunc(sysdate)) from dual;

При выполнении вышеуказанного запроса я получаю следующую ошибку

ORA-00932: inconsistent datatypes: expected NUMBER got DATE

Похоже, когда я беру строку или число вместо trunc(sysdate), это работает нормально.

2 4
nvl

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 перегружена. Очевидно, когда вы передаете ему A null, он интерпретирует значение как число и возвращает число. Любая из следующих работ:

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;

Чтобы получить ответ, что фактически решает вашу проблему, я бы рекомендовал отредактировать вопрос, чтобы включить код, который действительно демонстрирует проблему.