Le date non hanno un formato:sono rappresentate da 7 o 8 byte .
SELECT DUMP( SYSDATE ) FROM DUAL;
Potrebbe produrre:
Typ=13 Len=8: 220,7,11,26,16,41,9,0
Questo formato è molto utile per i computer per confrontare le date ma non così utile per le persone; quindi, quando il client SQL (SQL/plus, SQL Developers, TOAD, ecc.) Visualizza una data non visualizza i byte ma la visualizza come una stringa.
Lo fa effettuando una chiamata implicita a TO_CHAR()
(o qualche altro metodo interno di stringa di date) e utilizza una maschera di formato predefinita per eseguire questa conversione.
SQL/Plus e SQL Developer utilizzeranno il parametro di sessione dell'utente NLS_DATE_FORMAT
per eseguire questa conversione - vedi questa risposta
al riguardo.
Quindi la tua seconda query viene implicitamente convertita per fare qualcosa che si avvicina a questo (ma, quasi certamente, in modo più efficiente):
SELECT TO_CHAR(
TO_DATE('01-01-2015','DD-MM-YYYY'),
( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
)
FROM DUAL