systimestamp问题之间的间隔(oracle)
我有一个程序TTTsystimestamp问题之间的间隔(oracle),oracle,intervals,systimestamp,Oracle,Intervals,Systimestamp,我有一个程序TTT v_start_date TIMESTAMP; v_delta_interval interval day to second; begin v_start_date := SYSTIMESTAMP; /* some code */ v_delta_interval := SYSTIMESTAMP - v_start_date; insert into tmp_log_table values (v_start_date, v_delta_interval
v_start_date TIMESTAMP;
v_delta_interval interval day to second;
begin
v_start_date := SYSTIMESTAMP;
/* some code */
v_delta_interval := SYSTIMESTAMP - v_start_date;
insert into tmp_log_table
values (v_start_date, v_delta_interval, SYSTIMESTAMP);
end;
问题在于systimestamp之间的间隔(v_delta_interval)。
如果一个作业运行了这个过程-这一切都没问题,但是如果用户运行了它-有时它会计算为+4小时。
我的日志表:
create table tmp_log_table
(
t_v_start_date TIMESTAMP(6),
t_v_delta_interval INTERVAL DAY(2) TO SECOND(6),
t_timestamp_log TIMESTAMP(6)
);
有时我在tmp_log_表中有这样的值:
SQL> select cast(t_timestamp_log - t_v_start_date as INTERVAL DAY(2) TO SECOND(6)) as CLC_INTERVAL,
T_V_DELTA_INTERVAL,
t_timestamp_log,
T_V_START_DATE
from tmp_log_table t;
CLC_INTERVAL T_V_DELTA_INTERVAL T_TIMESTAMP_LOG T_V_START_DATE
--------------------------------------- --------------------------------------- ------------------------------------------------- -------------------------------------------------
+00 00:00:31.897890 +00 04:00:31.895883 20-JAN-20 11.30.28.825271 AM 20-JAN-20 11.29.56.927381 AM
+00 00:00:46.392905 +00 04:00:46.382724 21-JAN-20 09.14.28.866425 AM 21-JAN-20 09.13.42.473520 AM
为什么过程中的值之间有+4小时的差异?我认为问题在于SYSTIMESTAMP有时区,但变量v_start_date没有时区。用户是否使用
LOCALTIMESTAMP
而不是SYSTIMESTAMP
?我认为SYSTIMESTAMP不是问题所在,因为当转换为时间戳时,Oracle只会删除时区。如果在任何地方都使用了SYSTIMESTAMP
,则它应该始终相同。SYSTIMESTAMP
在数据库服务器操作系统的时区中返回。通常情况下,这不会改变,我强烈假设您没有在任何地方使用SYSTIMESTAMP
。因此,首先,我将我的tmp_日志表:键入TIMESTAMP(6)
到TIMESTAMP(6)和时区。
因此,t_v_start_date的值变为+7:00,t_TIMESTAMP_log的值变为+3:00。然后,下一步是将变量v_start_date的声明从TIMESTAMP
更改为TIMESTAMP WITH TIME ZONE
,这就解决了问题(在表中,t_v_start_date和t_TIMESTAMP_log两列都变成+3:00)