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?

¿Fue útil?

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 TIMESTAMPs. Cuando se restan dos DATEs, el resultado es un NUMBER; cuando se resta dos TIMESTAMPs, 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top