Para su ejemplo, puede 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)
Desafortunadamente, Oracle no tiene un método para realizar la conversión, si es posible, y de lo contrario devolver NULL. SQL Server introdujo recientemente try_convert()
para este propósito.
Una opción es escribir su propia función con un controlador de excepciones para la conversión fallida. El controlador de excepciones simplemente devolvería NULL
por un mal formato.