Du gör flera implicita datumkonverteringar i båda versionerna. Detta:
SELECT to_date(to_char(to_date('01-FEB-1949'))) FROM DUAL;
motsvarar:
SELECT to_date(to_char(to_date('01-FEB-1949', <NLS_DATE_FORMAT>),
<NLS_DATE_FORMAT>, <NLS_DATE_FORMAT>)) FROM DUAL;
medan den andra frågan har en av dem som ersatts med ett specifikt format. Det ser ut som ditt standardformat - som du kan ställa in, tror jag, i Pad-inställningarna utan att ändra registret direkt; det är inte klart om du ens ändrar något relaterat till padda - är DD-MON-RR
, som visas genom att koppla in det i dessa frågor:
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 )
Du kan se i denna SQL-fiol
att i den första versionen visas datumet som en sträng med årtalet som 49
snarare än 1949
, och det tolkas sedan - av RR
mask - som 2049
, vilket är det förväntade beteendet.
Kort version:lita aldrig på implicita datumkonverteringar eller NLS-datumformatmasken.