J'ai cette requête dans oracle :

 DELETE FROM my_table
 WHERE to_date(last_update, 'DD/MM/YYYY') < to_date('01/01/2000', 'DD/MM/YYYY');

Lorsque je lance ceci, j'obtiens cette erreur : ORA-01841 : l'année (complète) doit être comprise entre -4713 et +9999 et ne doit pas être 0

Il n'y a pas de valeur 0 dans le tableau.

Quelqu'un sait quel est le problème ?

0
mona shiri 31 mars 2021 à 11:27

2 réponses

Meilleure réponse

Je suppose que vous avez stocké vos dates comme une chaîne avec le format DD/MM/YYYY; Ce serait mieux si vous les stockiez tous comme un type de données DATE, puis vous n'auriez pas à faire cette conversion (et vous utiliseriez le type de données le plus approprié pour les données).

À partir d'Oracle 12, vous pouvez utiliser:

SELECT *
FROM   my_table
WHERE  TO_DATE( last_update, 'DD/MM/YYYY' DEFAULT NULL ON CONVERSION ERROR ) IS NULL;

Identifier les lignes qui élevent cette exception.


Si vous les stockez déjà comme un type de données DATE}, n'utilisez pas TO_DATE sur une valeur déjà une valeur déjà DATE comme TO_DATE s'attend à une chaîne afin que Oracle soit implicitement lancer votre DATE à une chaîne puis essayer de le convertir et que votre requête est efficace:

DELETE FROM my_table
WHERE  TO_DATE(
         TO_CHAR(
           last_update,
           ( SELECT value FROM NLS_SESSION_SETTINGS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
         ),
         'DD/MM/YYYY'
       ) < to_date('01/01/2000', 'DD/MM/YYYY');

Et si le modèle NLS_DATE_FORMAT et votre modèle de format ne correspondent pas, vous obtiendrez des erreurs (ou, pire, la requête réussira et que vos données seront incohérentes, car il peut avoir échangé des jours et des mois, des mois et des années).

Au lieu de cela, utilisez simplement:

DELETE FROM my_table
WHERE last_update < DATE '2000-01-01';
2
MT0 31 mars 2021 à 08:47

Si le type de données de last_update est de la date, n'utilisez pas la fonction TO_DATE:

DELETE FROM my_table
 WHERE last_update < to_date('01/01/2000', 'DD/MM/YYYY');
1
Kapitany 31 mars 2021 à 08:57