As datas não têm formato - elas são representadas por 7 ou 8 bytes .
SELECT DUMP( SYSDATE ) FROM DUAL;
Pode produzir:
Typ=13 Len=8: 220,7,11,26,16,41,9,0
Este formato é muito útil para computadores compararem datas, mas não é tão útil para pessoas; portanto, quando o cliente SQL (SQL/plus, SQL Developers, TOAD, etc) exibe uma data, ele não exibe os bytes, mas o exibe como uma string.
Ele faz isso fazendo uma chamada implícita para
TO_CHAR()
(ou algum outro método interno de stringificação de datas) e usa uma máscara de formato padrão para realizar essa conversão. SQL/Plus e SQL Developer usarão o parâmetro de sessão do usuário
NLS_DATE_FORMAT
para realizar essa conversão - consulte esta resposta
em relação a este. Portanto, sua segunda consulta está sendo convertida implicitamente para fazer algo parecido com isso (mas, quase certamente, com mais eficiência):
SELECT TO_CHAR(
TO_DATE('01-01-2015','DD-MM-YYYY'),
( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
)
FROM DUAL