Bonjour,

Version Oracle :
Oracle Database 10g Release 10.1.0.5.0 - Production
J'ai une table qui contient entre autres deux champs :
- 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 :
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 != ' ';
Cette requête fonctionne parfaitement.
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 :
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;
Et là c'est le drame : contre toute attente, je me prends dans la tête l'erreur suivante :
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
Pourtant, je n'ai pas de date fantaisiste. Et si j'en avais, la première requête provoquerait aussi une erreur !

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...