Возможно ли, что ваш DATECOL в базе данных действительно является строкой? Потому что, если это так, DECODE всегда берет первый потенциальный возвращаемый элемент для установки типа данных. И как только вы начнете смешивать и сопоставлять типы данных, могут случиться плохие вещи.
Например,
SQL> alter session set nls_date_format = 'YY-MM-DD';
Session altered.
SQL> with t as
2 ( select 'A' col1, '2010-01-01' datecol from dual union all
3 select 'B' col1, '2010-01-01' datecol from dual )
4 select CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE)
5 from t;
CAST(DEC
--------
10-01-01
00-01-01
Кажется, это нормально, но если я копаюсь в значение, которое фактически вернулось после все перескакивая через типы данных
SQL> with t as
2 ( select 'A' col1, '2010-01-01' datecol from dual union all
3 select 'B' col1, '2010-01-01' datecol from dual )
4 select to_char(CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE),'dd-mm-yyyy')
5 from t;
TO_CHAR(CA
----------
01-01-2010
01-01-2000
, вы можете видеть, что отсутствие спецификации полного столетия "исказило" результат. В частности, инструменты, которые вы используете (SQL Developer и другие), будут иметь свое собственное форматирование результатов, которое может маскировать то, что может происходить с типами данных.