systimestamp问题之间的间隔(oracle)

systimestamp问题之间的间隔(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

我有一个程序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, 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)