不同时区查询条件下的Oracle systimestamp

不同时区查询条件下的Oracle systimestamp,oracle,jdbc,timestamp,timezone,Oracle,Jdbc,Timestamp,Timezone,我使用列lock\u直到时间戳(3)得到以下代码。代码插入systimestamp+5分钟,然后使用lock\u选择所有行,直到

我使用列
lock\u直到时间戳(3)
得到以下代码。代码插入
systimestamp+5分钟
,然后使用
lock\u选择所有行,直到
。我希望结果集中不会有任何行,因为
锁定_直到
是在将来,但是返回了该行。最可能的原因是我的本地时区是UTC+2,但我不知道这怎么可能。该代码在
current\u timestamp
中可以正常工作,但我更希望该代码与客户端时区无关

jdbcTemplate.update("delete from shedlock where name = 'test'");
System.out.println(jdbcTemplate.queryForList("SELECT SESSIONTIMEZONE FROM dual"));
// insert, lock_until is now + 5 minutes
jdbcTemplate.update("INSERT INTO shedlock(name, lock_until, locked_at, locked_by) VALUES('test', systimestamp + 5/(24 * 60), systimestamp, 'me')");
// select if lock_until <= systimestamp
System.out.println(jdbcTemplate.queryForList("select * from shedlock where lock_until <= systimestamp"));
// systimestamp ?
System.out.println(jdbcTemplate.queryForList("select systimestamp from dual"));
从:

SYSTIMESTAMP
返回数据库所在系统的系统日期,包括小数秒和时区。返回类型为带时区的时间戳

当您这样做时:

插入到shedlock中(
名称
把你锁起来直到,
锁定在,
被锁定
)价值观(
"测试",,
systimestamp+5/(24*60),
系统时间戳,
“我”
)
它隐含着:

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'
)
这将丢弃时区信息,并保持其他日期/时间组件不变

但是,当您执行
选择时,它隐式地执行以下操作:

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'
)
选择*
从shedlock

如果您直接在数据库中运行相同的语句,那么从_TZ(lock_until,SESSIONTIMEZONE)到哪里会遇到相同的问题?如果是这样,那么它与JDBC无关,可能与不同的时区有关。
从双输出中选择什么字符(systimestamp,'YYYY-MM-DD HH24:MI:SS.FF9 TZR')?我敢打赌,这不会以
Europe/Prague
结尾。谢谢,这是有道理的。相关答案