Из документации Oracle :
SYSTIMESTAMP
возвращает системную дату, включая доли секунды и часовой пояс системы, в которой находится база данных. Тип возвращаемого значения TIMESTAMP WITH TIME ZONE
.
Когда вы делаете:
INSERT INTO shedlock (
name,
lock_until,
locked_at,
locked_by
) VALUES (
'test',
systimestamp + 5/(24 * 60),
systimestamp,
'me'
)
Это неявно делает:
INSERT INTO shedlock (
name,
lock_until,
locked_at,
locked_by
) VALUES (
'test',
CAST( systimestamp + 5/(24 * 60) AS TIMESTAMP(3) ),
CAST( systimestamp AS TIMESTAMP(3) ),
'me'
)
, который будет отбрасывать часовой пояс информацию и оставьте другие компоненты даты / времени как есть.
Однако, когда вы делаете SELECT
, это неявно делает:
select *
from shedlock
where FROM_TZ( lock_until, SESSIONTIMEZONE ) <= systimestamp
и добавление часового пояса сеанса к сохраненное значение и затем сравнение его с временной меткой с часовым поясом системы, в которой находится база данных; если эти два часовых пояса не совпадают, вы получите неожиданно включенные / исключенные строки.
Вместо этого вы можете явно преобразовать SYSTIMESTAMP
из типа данных TIMESTAMP WITH TIME ZONE
в данные TIMESTAMP
тип:
select *
from shedlock
where lock_until <= CAST( systimestamp AS TIMESTAMP(3) )
дБ <> скрипка