Per il tuo esempio, puoi usare case :
select (case when my_year is not null and my_year <> 0 and
my_year between -4713 and 9999
then TO_DATE(my_year || '-01-01', 'YYYY-MM-DD')
end)
Sfortunatamente, Oracle non dispone di un metodo per eseguire la conversione, se possibile, e altrimenti restituire NULL. SQL Server ha recentemente introdotto try_convert() a questo scopo.
Un'opzione è scrivere la propria funzione con un gestore di eccezioni per la conversione non riuscita. Il gestore delle eccezioni restituirà semplicemente NULL per un formato errato.