sql >> Base de Datos >  >> RDS >> Oracle

TIMESTAMPDIFF en Oracle 11g?

Esa función no existe en Oracle RDMBS; claramente lo hizo en Oracle Lite (que nunca he encontrado) y creo que está en otras bases de datos como MySQL.

Hay documentación que cubre aritmética de intervalos y fechas y horas que te llevará parte del camino allí; puede restar una marca de tiempo de otra; o una fecha de otra, o una combinación de las dos, pero es más sencillo ceñirse a un tipo de datos. Según cuál utilice, obtendrá un intervalo o un número que representa la cantidad de días:

SQL> SELECT CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00' FROM DUAL;

CURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00'
---------------------------------------------------------------------------
+000006169 16:16:21.287166000

SQL> SELECT CURRENT_DATE - DATE '1998-12-09' FROM DUAL;

CURRENT_DATE-DATE'1998-12-09'
-----------------------------
                   6169.67775

Si solo desea la cantidad de días completos, puede usar extract() para que el intervalo obtenga solo el elemento que desea, o trunc() para que el número elimine la parte fraccionaria:

SQL> SELECT EXTRACT(DAY FROM CURRENT_TIMESTAMP - TIMESTAMP '1998-12-09 00:00:00') FROM DUAL;

EXTRACT(DAYFROMCURRENT_TIMESTAMP-TIMESTAMP'1998-12-0900:00:00')
---------------------------------------------------------------
                                                           6169

SQL> SELECT TRUNC(CURRENT_DATE - DATE '1998-12-09') FROM DUAL;

TRUNC(CURRENT_DATE-DATE'1998-12-09')
------------------------------------
                                6169

También puede trunc() la fecha actual antes de la comparación si lo prefiere, por lo que está comparando ambos a la medianoche, lo que significa que no habrá una parte del día fraccionario para eliminar:

SQL> SELECT TRUNC(CURRENT_DATE) - DATE '1998-12-09' FROM DUAL;

TRUNC(CURRENT_DATE)-DATE'1998-12-09'
------------------------------------
                                6169

He usado literales de fecha ANSI para la fecha fija, pero puede usar una variable o columna de fecha o marca de tiempo existente; o to_date() o to_timestamp() si tiene una cadena en un formato diferente.

También puede usar extract() para convertir los componentes de un intervalo en un valor combinado, como se muestra aquí ; y también asegúrese de conocer la diferencia entre current_date y sysdate y los equivalentes de marca de tiempo .