Pour votre exemple, vous pouvez utiliser 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)
Malheureusement, Oracle n'a pas de méthode pour effectuer la conversion, si possible, et sinon renvoyer NULL. SQL Server a récemment introduit try_convert()
à cet effet.
Une option consiste à écrire votre propre fonction avec un gestionnaire d'exceptions pour la conversion qui a échoué. Le gestionnaire d'exception renverrait simplement NULL
pour un mauvais format.