不同时区查询条件下的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
结尾。谢谢,这是有道理的。相关答案