Les dates n'ont pas de format - elles sont représentées par 7 ou 8 octets .
SELECT DUMP( SYSDATE ) FROM DUAL;
Peut afficher :
Typ=13 Len=8: 220,7,11,26,16,41,9,0
Ce format est très utile pour les ordinateurs pour comparer les dates mais pas si utile pour les gens; ainsi, lorsque le client SQL (SQL/plus, SQL Developers, TOAD, etc.) affiche une date, il n'affiche pas les octets mais l'affiche sous forme de chaîne.
Il le fait en faisant un appel implicite à TO_CHAR()
(ou une autre méthode interne de stringification des dates) et utilise un masque de format par défaut pour effectuer cette conversion.
SQL/Plus et SQL Developer utiliseront le paramètre de session de l'utilisateur NLS_DATE_FORMAT
pour effectuer cette conversion - voir cette réponse
à ce sujet.
Donc, votre deuxième requête est implicitement convertie pour faire quelque chose qui s'en rapproche (mais, presque certainement, plus efficacement) :
SELECT TO_CHAR(
TO_DATE('01-01-2015','DD-MM-YYYY'),
( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
)
FROM DUAL