Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

convertendo aaaa-mm-dd em mm/dd/aaaa


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.