Vous effectuez plusieurs conversions de date implicites dans les deux versions. Ceci :
SELECT to_date(to_char(to_date('01-FEB-1949'))) FROM DUAL;
est équivalent à :
SELECT to_date(to_char(to_date('01-FEB-1949', <NLS_DATE_FORMAT>),
<NLS_DATE_FORMAT>, <NLS_DATE_FORMAT>)) FROM DUAL;
tandis que la deuxième requête a l'un de ceux remplacés par un format spécifique. Cela ressemble à votre format par défaut - que vous pouvez définir, je crois, dans les préférences de Toad sans modifier directement le registre ; il n'est pas clair si vous modifiez même quelque chose lié à Toad - est DD-MON-RR
, comme indiqué en l'associant à ces requêtes :
SELECT to_date(to_char(to_date('01-FEB-1949','DD-MON-RR'),
'DD-MON-RR'),'DD-MON-RR') AS date1,
to_date(to_char(to_date('01-FEB-1949','DD-MON-RR'),
'dd-MON-yyyy'),'DD-MON-RR') AS date2 FROM DUAL;
DATE1 DATE2
February, 01 2049 00:00:00+0000 February, 01 1949 00:00:00+0000
(SQL Fiddle )
Vous pouvez voir dans ce SQL Fiddle
que dans la première version, la date apparaît sous forme de chaîne avec l'année sous la forme 49
plutôt que 1949
, et qui est ensuite interprété - par le RR
masque - comme 2049
, qui est le comportement attendu.
Version courte :ne vous fiez jamais aux conversions de date implicites ou au masque de format de date NLS.