Som ditt exempel kan du använda 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)
Tyvärr har Oracle ingen metod för att göra konverteringen, om möjligt, och annars returnera NULL. SQL Server introducerade nyligen try_convert() för detta ändamål.
Ett alternativ är att skriva din egen funktion med en undantagshanterare för den misslyckade konverteringen. Undantagshanteraren skulle helt enkelt returnera NULL för ett dåligt format.