Bonjour,
Version Oracle :
J'ai une table qui contient entre autres deux champs :Oracle Database 10g Release 10.1.0.5.0 - Production
- DATFIN VARCHAR(8) qui contient une date au format YYYYMMDD
- HEUFIN VARCHAR(4) qui contient une heure au format HH24MI
La concaténation des deux me donne l'heure de fin d'un traitement.
Je cherche à trouver toutes les lignes dont la date de fin de traitement est inférieure à sysdate moins 2 minutes (traitements terminés il y a moins de 2 minutes)
Voici une première requête qui me permet de retrouver tous les traitements avec mon calcul :
Cette requête fonctionne parfaitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select ut_spl.batch, sysdate - to_date(ut_spl.datfin || ut_spl.heufin, 'YYYYMMDDHH24MI') from ut_spl where ut_spl.codsoc = 100 and ut_spl.st1 = 4 and ut_spl.datfin != ' ' and ut_spl.heufin != ' ';
Je peux parcourir l'ensemble des lignes retournées sans lever la moindre exception.
Je modifie alors mon WHERE pour ne retourner que les lignes modifiés il y a moins de deux minutes :
Et là c'est le drame : contre toute attente, je me prends dans la tête l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select ut_spl.batch, sysdate - to_date(ut_spl.datfin || ut_spl.heufin, 'YYYYMMDDHH24MI') from ut_spl where ut_spl.codsoc = 100 and ut_spl.st1 = 4 and ut_spl.datfin != ' ' and ut_spl.heufin != ' ' and (sysdate - to_date(ut_spl.datfin || ut_spl.heufin, 'YYYYMMDDHH24MI')) <= 0.001388;
Pourtant, je n'ai pas de date fantaisiste. Et si j'en avais, la première requête provoquerait aussi une erreur !ORA-01841: (full) year must be between -4713 and +9999, and not be 0
01841. 00000 - "(full) year must be between -4713 and +9999, and not be 0"
*Cause: Illegal year entered
*Action: Input year in the specified range
Ké passa ?
Aussi, comment puis-je faire proprement et de façon performante ma comparaison avec "2 minutes" ? Parce que le 0.001388, ça fait un peu magic number sorti du chapeau...
Partager