Trabalhando com CURRENT_DATE, CURRENT_TIMESTAMP e LOCALTIMESTAMP

CURRENT_DATE

CURRENT_DATE retorna a data atual no fuso horário da sessão, em um valor no calendário gregoriano do tipo de dados DATE. Exemplos de execução básica:

select TO_TIMESTAMP(TO_CHAR(CURRENT_DATE,'DD-MON-YYYY HH:MI:SS')) FROM DUAL;
--14-NOV-19 04.09.16.000000 AM
select TO_CHAR(CURRENT_DATE,'DD-MON-YYYY HH:MI:SS') FROM DUAL;
--14-NOV-2019 04:10:19

O exemplo a seguir ilustra que CURRENT_DATE é sensível ao fuso horário da sessão:

ALTER SESSION SET TIME_ZONE = '-5:0';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

SESSIONTIMEZONE CURRENT_DATE
--------------- --------------------
-05:00          29-MAY-2000 13:14:03

ALTER SESSION SET TIME_ZONE = '-8:0';
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

SESSIONTIMEZONE CURRENT_DATE
--------------- --------------------
-08:00          29-MAY-2000 10:14:33

CURRENT_TIMESTAMP

CURRENT_TIMESTAMP retorna a data e hora atuais no fuso horário da sessão, em um valor do tipo de dados TIMESTAMP WITH TIME ZONE. O deslocamento do fuso horário reflete o horário local atual da sessão SQL. Se você omitir a precisão, o padrão será 6. A diferença entre esta função e LOCALTIMESTAMP é que CURRENT_TIMESTAMP retorna um valor TIMESTAMP WITH TIME ZONE enquanto LOCALTIMESTAMP retorna um valor TIMESTAMP.

No argumento opcional, precision especifica a segunda precisão fracionária do valor de tempo retornado.

O exemplo a seguir ilustra que CURRENT_TIMESTAMP é sensível ao fuso horário da sessão:

ALTER SESSION SET TIME_ZONE = '-5:0';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;

SESSIONTIMEZONE CURRENT_TIMESTAMP
--------------- ---------------------------------------------------
-05:00          04-APR-00 01.17.56.917550 PM -05:00

ALTER SESSION SET TIME_ZONE = '-8:0';
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;

SESSIONTIMEZONE CURRENT_TIMESTAMP
--------------- ----------------------------------------------------
-08:00          04-APR-00 10.18.21.366065 AM -08:00

Ao usar o CURRENT_TIMESTAMP com uma máscara de formato, verifique se a máscara de formato corresponde ao valor retornado pela função. Por exemplo, considere a seguinte tabela:

CREATE TABLE current_test (col1 TIMESTAMP WITH TIME ZONE);

A instrução a seguir falha porque a máscara não inclui a parte do fuso horário do tipo retornada pela função:

INSERT INTO current_test VALUES
(TO_TIMESTAMP_TZ(CURRENT_TIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));

A instrução a seguir usa a máscara de formato correta para corresponder ao tipo de retorno CURRENT_TIMESTAMP:

INSERT INTO current_test VALUES
(TO_TIMESTAMP_TZ(CURRENT_TIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM TZH:TZM'));

LOCALTIMESTAMP

LOCALTIMESTAMP retorna a data e hora atuais no fuso horário da sessão em um valor do tipo de dados TIMESTAMP. A diferença entre esta função e CURRENT_TIMESTAMP é que LOCALTIMESTAMP retorna um valor TIMESTAMP enquanto CURRENT_TIMESTAMP retorna um valor TIMESTAMP WITH TIME ZONE.

Exemplo básico:

SELECT LOCALTIMESTAMP FROM DUAL
--14-NOV-19 04.53.29.325706 AM

O argumento opcional timestamp_precision especifica a segunda precisão fracionária do valor de tempo retornado.

Este exemplo ilustra a diferença entre LOCALTIMESTAMP e CURRENT_TIMESTAMP:

ALTER SESSION SET TIME_ZONE = '-5:00';
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;

CURRENT_TIMESTAMP                    LOCALTIMESTAMP
-------------------------------------------------------------------
04-APR-00 01.27.18.999220 PM -05:00  04-APR-00 01.27.19 PM

ALTER SESSION SET TIME_ZONE = '-8:00';
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;

CURRENT_TIMESTAMP                    LOCALTIMESTAMP
-----------------------------------  ------------------------------
04-APR-00 10.27.45.132474 AM -08:00  04-APR-00 10.27.451 AM

Ao usar o LOCALTIMESTAMP com uma máscara de formato, verifique se a máscara de formato corresponde ao valor retornado pela função. Por exemplo, considere a seguinte tabela:

CREATE TABLE local_test (col1 TIMESTAMP WITH LOCAL TIME ZONE);

A instrução a seguir falha porque a máscara não inclui a parte do fuso horário do tipo de retorno da função:

INSERT INTO local_test
  VALUES (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF'));

A instrução a seguir usa a máscara de formato correta para corresponder ao tipo de retorno de LOCALTIMESTAMP:

INSERT INTO local_test
  VALUES (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));

Referência

Database SQL Language Reference