Question

J'ai un intervalle de temps oracle dans une instruction select comme ceci:

SELECT ...
    CASE WHEN date1 - date2 > 0 
    THEN 'No'
    ELSE 'YES'
END 

Cela échoue avec un type de données non valide. J'ai donc essayé cela, et il ne fonctionne toujours pas.

SELECT ...
    CASE WHEN date1 - date2 > (sysdate - sysdate) 
    THEN 'No'
    ELSE 'YES'
END 

Est-il possible de comparer les types d'intervalle?

Était-ce utile?

La solution 5

J'ai découvert quand j'ajouté day to second il a tourné la deuxième valeur dans un intervalle et cela a fonctionné. Merci à tous pour les idées.

SELECT ...
    CASE WHEN date1 - date2 > (sysdate - sysdate) day to second
    THEN 'No'
    ELSE 'YES'
END 

Autres conseils

Votre question mentionne le type de données INTERVALLE, bien qu'il ne soit pas clair de vos exemples ou si ce qui se passe. Arithmétique avec des dates et des intervalles est assez simple;

SQL> select d1
  2         , d2
  3         , case when d2  > d1 + to_dsinterval ('10 0:0:0')
  4                 then 'no'
  5                 else 'yes' end
  6  from t34
  7  /

D1        D2        CAS
--------- --------- ---
02-JUL-10 25-JUN-10 yes
02-JUL-10 24-AUG-10 no
02-JUL-10 26-MAY-10 yes
02-JUL-10 25-JUL-10 no
02-JUL-10 15-APR-09 yes
02-JUL-10 13-JUL-10 no

6 rows selected.

SQL>

Lorsque les deux colonnes sont INTERVALLE type de données, l'arithmétique fonctionne bien:

SQL> select intvl1
  2         , intvl2
  3         , case when intvl2  > intvl1
  4                 then 'no'
  5                 else 'yes' end
  6  from t34
  7  /

INTVL1               INTVL2               CAS
-------------------- -------------------- ---
+10 00:00:00.000000  +07 00:00:00.000000  yes
+10 00:00:00.000000  -53 00:00:00.000000  yes
+10 00:00:00.000000  +37 00:00:00.000000  no
+10 00:00:00.000000  -23 00:00:00.000000  yes
+10 00:00:00.000000  +78 00:00:00.000000  no
+10 00:00:00.000000  -11 00:00:00.000000  yes

6 rows selected.

SQL>

En comparant la différence entre deux dates et un intervalle est un jeu d'enfant ...

SQL> select d1
  2         , d2
  3         , intvl1
  4         , case when  numtodsinterval(d1-d2, 'DAY') > intvl1
  5                 then 'no'
  6                 else 'yes' end
  7  from t34
  8  /

D1        D2        INTVL1               CAS
--------- --------- -------------------- ---
02-JUL-10 25-JUN-10 +10 00:00:00.000000  yes
02-JUL-10 24-AUG-10 +10 00:00:00.000000  yes
02-JUL-10 26-MAY-10 +10 00:00:00.000000  no
02-JUL-10 25-JUL-10 +10 00:00:00.000000  yes
02-JUL-10 15-APR-10 +10 00:00:00.000000  no
02-JUL-10 13-JUL-10 +10 00:00:00.000000  yes

6 rows selected.

SQL>

En bref, il est difficile de comprendre ce que vous faites pour obtenir une erreur. Donc, vous devez modifier votre question et de fournir plus de détails. Décrire la table. Fournir quelques exemples de données. De plus, nous donner l'intégralité du message d'erreur.

Si j'exécutez la commande suivante sur ma base de données 10g, tout fonctionne bien:

SQL> create table temptbl (d1 date, d2 date);

Table created

SQL> insert into temptbl values (sysdate, sysdate-1/12);

1 row inserted

SQL> insert into temptbl values (sysdate, sysdate+1/12);

1 row inserted

SQL> SELECT CASE WHEN d1 - d2 > 0 THEN 'No' ELSE 'YES' END result FROM temptbl;

RESULT
------
No
YES

Que faites-vous dans cette déclaration?

Si vous effectuez des opérations arithmétiques sur les types INTERVALLE JOUR Deuxièmement, vous devez la comparer à une autre colonne INTERVALLE JOUR SECOND.

SQL> SELECT
  2         CASE when (NUMTODSINTERVAL(1, 'DAY') - NUMTODSINTERVAL (1, 'HOUR')) 
                        > (numtodsinterval(0, 'day'))
  3              then 1
  4              else 0
  5         end as expression
  6*  from dual
med_audit@AGDEV:SQL> /

EXPRESSION
----------
         1

Lors d'une supposition, je dirais que vos colonnes sont TIMESTAMPs. Lorsque vous soustrayez deux DATEs, le résultat est un NUMBER; lorsque vous soustrayez deux TIMESTAMPs, le résultat est un INTERVAL. Pour fixer votre deuxième requête, remplacez SYSDATE avec SYSTIMESTAMP:

SELECT ...
    CASE WHEN date1 - date2 > (systimestamp - systimestamp) 
    THEN 'No'
    ELSE 'YES'
END 
...

Cependant, vous seriez mieux d'utiliser TO_DSINTERVAL, comme cela a déjà été suggéré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top