Oracle DB programming

Comparing SYSTIMESTAMP with datetime variables

Posted
SYSTIMESTAMP возвращает тип данных TIMESTAMP WITH TIME ZONE.

При сравнении данных разных типов, если один из операндов TIMESTAMP WITH TIME ZONE, другой
операнд также неявно приводится к TIMESTAMP WITH TIME ZONE. Когда DATE или TIMESTAMP неявно
приводится к TIMESTAMP WITH TIME ZONE, в качестве часовой зоны используется сессионный параметр,
который в JOB'ах (DBMS_JOB) по умолчанию равен 0, а для нормальных сессий определяется установками на клиенте.

You can set the default session time zone with the ORA_SDTZ environment variable. When users retrieve TIMESTAMP WITH LOCAL TIME ZONE data, Oracle returns it in the users' session time zone. The session time zone also takes effect when a TIMESTAMP value is converted to the TIMESTAMP WITH TIME ZONE or TIMESTAMP WITH LOCAL TIME ZONE datatype.

При этом для SYSDATE и SYSTIMESTAMP всегда учитывается зона, установленная для БД на уровне операционной системы,
не зависимо от значения сессионного параметра.

Так что когда в job'е, запущенном через DBMS_JOB, выполняется сравнение
f1 <= systimestamp, и f1 имеет тип date или простой timestamp, то это приводится к UTC как

f1 - 0 <= <текущее Московское время> - 4

Функция to_char принимает аргументы всех типов без неявного преобразования, поэтому systimestamp в ней отображает
текущее время для временной зоны ОС сервера.

TO_CHAR (datetime) converts a datetime or interval value of DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, or TIMESTAMP WITH LOCAL TIME ZONE datatype to a value of VARCHAR2 datatype