En comparant le type de données d'intervalle Oracle
-
02-10-2019 - |
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?
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 TIMESTAMP
s. Lorsque vous soustrayez deux DATE
s, le résultat est un NUMBER
; lorsque vous soustrayez deux TIMESTAMP
s, 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é.