As datas não têm um formato - elas são representadas internamente por 7 ou 8 bytes . É somente quando um programa cliente recebe uma data que esse programa cliente (potencialmente) fornece um formato.
O formato de string padrão para datas no SQL/Plus ou SQL Developer é definido pelo
NLS_DATE_FORMAT
parâmetro de sessão. Outros clientes normalmente terão parâmetros que você pode definir para o formato de data padrão (se eles também não usarem o NLS
definições). No entanto, esteja ciente de que o NLS_DATE_FORMAT
é um parâmetro de sessão, portanto, pertence à sessão do usuário e vários usuários podem ter um valor diferente para o parâmetro correspondente à forma como o definiram. Se você quiser dar a uma data um formato específico, precisará convertê-la em uma string:
SELECT TO_CHAR( DATE '2016-05-01', 'MM/DD/YYYY HH24:MI:SS' )
FROM DUAL;
Por que sua consulta não funciona :
TO_DATE( value, frmt )
espera um valor de string e uma máscara de formato. O TO_DATE('2016-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
interno é perfeitamente válido e retornará a DATE '2016-05-01'
. No entanto, o
TO_DATE()
externo está sendo passado o DATE
tipo que você acabou de gerar e o formato da string (em vez das duas strings que está esperando). O Oracle chamará implicitamente TO_CHAR()
na data e use o NLS_DATE_FORMAT
parâmetro de sessão como a máscara de formato. Isso está gerando uma string a partir da data e, dado o erro, o valor de NLS_DATE_FORMAT
não é MM/DD/YYYY HH24:MI:SS
então quando o TO_DATE()
externo tenta analisar a string criada implicitamente, mas falha, pois o primeiro número lido é inválido por um mês.