Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

TIMESTAMPDIFF no Oracle 11g?


Essa função não existe no Oracle RDMBS; claramente no Oracle Lite (que eu nunca encontrei) e acredito que esteja em outros bancos de dados como o MySQL.

Há documentação que abrange aritmética de data e hora e intervalo que o levará até lá; você pode subtrair um timestamp de outro; ou uma data de outra, ou uma mistura dos dois - mas é mais simples manter um tipo de dados. Dependendo de qual você usar, você obterá um intervalo ou um número representando o número de dias:
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

Se você quiser apenas o número de dias inteiros, use extract() para que o intervalo obtenha apenas o elemento desejado ou trunc() para o número remover a parte fracionária:
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

Você também pode trunc() a data atual antes da comparação, se preferir, então você está comparando as duas à meia-noite, o que significa que não haverá uma parte do dia fracionária a ser removida:
SQL> SELECT TRUNC(CURRENT_DATE) - DATE '1998-12-09' FROM DUAL;

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

Usei literais de data ANSI para a data fixa, mas você pode usar uma variável ou coluna de data ou carimbo de data/hora existente; ou to_date() ou to_timestamp() se você tiver uma string em um formato diferente.

Você também pode usar extract() para converter os componentes de um intervalo em um valor combinado, como mostrado aqui ; e também certifique-se de estar ciente da diferença entre current_date e sysdate , e os equivalentes de carimbo de data/hora .