Para o seu exemplo, você pode usar
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)
Infelizmente, o Oracle não tem um método de fazer a conversão, se possível, e retornar NULL. O SQL Server introduziu recentemente
try_convert()
para este fim. Uma opção é escrever sua própria função com um manipulador de exceção para a conversão com falha. O manipulador de exceção simplesmente retornaria
NULL
para um formato ruim.