Al comparar el tipo de datos de Oracle Intervalo
-
02-10-2019 - |
Pregunta
Tengo un intervalo de tiempo de Oracle en un comunicado de selección de la siguiente manera:
SELECT ...
CASE WHEN date1 - date2 > 0
THEN 'No'
ELSE 'YES'
END
Esta falla con un tipo de datos no válido. Así que he intentado esto, y no lo consigo.
SELECT ...
CASE WHEN date1 - date2 > (sysdate - sysdate)
THEN 'No'
ELSE 'YES'
END
¿Hay alguna manera de comparar los tipos de intervalo?
Solución 5
descubrí cuando he añadido day to second
resultó el segundo valor en un intervalo y funcionó. Gracias a todos por las ideas.
SELECT ...
CASE WHEN date1 - date2 > (sysdate - sysdate) day to second
THEN 'No'
ELSE 'YES'
END
Otros consejos
Su pregunta menciona el tipo de datos INTERVALO, aunque no está claro a partir de los ejemplos en los que o si lo que está sucediendo. Aritmética con fechas y los intervalos es bastante 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>
Cuando ambas columnas son de INTERVALO tipo de datos, la aritmética funciona claramente:
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>
La comparación de la diferencia entre dos fechas y un intervalo es un juego de niños ...
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 resumen, es difícil entender lo que está haciendo para obtener un error. Así que hay que corregir su pregunta y proporcionar más detalles. Describir la tabla. Proporcionar algunos datos de la muestra. Además, nos dan todo el mensaje de error.
Si yo haga lo siguiente en mi base de datos 10g, todo funciona 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
¿Qué más haces en esta declaración?
Si está realizando la aritmética de los tipos INTERVALO DE DÍA PARA En segundo lugar, es necesario comparar a otra columna INTERVALO DE DÍA PARA SEGUNDO.
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
En una conjetura, diría que sus columnas son TIMESTAMP
s. Cuando se restan dos DATE
s, el resultado es un NUMBER
; cuando se resta dos TIMESTAMP
s, el resultado es una INTERVAL
. Para fijar su segunda consulta, reemplace SYSDATE
con SYSTIMESTAMP
:
SELECT ...
CASE WHEN date1 - date2 > (systimestamp - systimestamp)
THEN 'No'
ELSE 'YES'
END
...
Sin embargo, sería mejor usar TO_DSINTERVAL
, como ya se ha sugerido.