强制 Oracle 的 sysdate 为 return 多个语句的不同值
Force Oracle's sysdate to return different value for multiple statements
我想强制 Oracle sysdate
函数为单独的语句 return 不同的值,就像在 Postgres 中一样。我已经对文档、网络和 SO 本身进行了一些挖掘,但找不到解决这个问题的答案。
这方面的文档似乎很差:see for yourself
我将 Oracle 11g 与 SQL Developer 18.3
一起使用
请阅读下面的 MVCE。
执行后:
create table t(a timestamp);
insert into t values (sysdate);
insert into t values (sysdate);
insert into t values (sysdate);
select * from t;
我得到:
A
---------------------------
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000
我想得到(手改):
A
---------------------------
18/12/25 04:25:59,1234
18/12/25 04:25:59,7281
18/12/25 04:26:00,1928
真正的问题出现在对过程的不同 CALL
语句中,但上面的示例似乎为我复制了这个问题。
更新
我发现有一个有用的方法是在语句之间放置停顿,但这并不是我想要的:
set pause on;
create table t(a timestamp);
insert into t values (sysdate);
pause
insert into t values (sysdate);
pause
insert into t values (sysdate);
我发现 current_timestamp
可以做到:
drop table t;
create table t(a timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
select * from t;
输出:
A
---------------------------
18/12/25 04:48:54,134000000
18/12/25 04:48:54,142000000
18/12/25 04:48:54,149000000
如文档中所述,the sysdate
function returns a date 只能精确到秒 - 它不支持小数秒。因此,同一秒内的多次调用将始终获得相同的值,并且您不能强制它执行任何其他操作。
您将该日期值放入 timestamp 列,这会导致从一种数据类型到另一种数据类型的隐式转换,但该转换不能 set/create 新的小数秒value - 它保留日期的隐式小数秒,当然它始终为零。
与 sysdate
一样,Oracle 具有 a systimestamp
function, which returns a timestamp with time zone 值 - 并且确实有小数秒。精度受您 运行 所在平台的限制。如果您使用它来填充您的普通时间戳列,那么隐式转换仍然会发生,但您实际上只是丢弃了时区信息。
Oracle 还支持 current_date
and current_timestamp
,它们非常相似 - 除了它们 return 当前会话时区的 date/time,而不是服务器时区的 sys*
个版本。
我想强制 Oracle sysdate
函数为单独的语句 return 不同的值,就像在 Postgres 中一样。我已经对文档、网络和 SO 本身进行了一些挖掘,但找不到解决这个问题的答案。
这方面的文档似乎很差:see for yourself
我将 Oracle 11g 与 SQL Developer 18.3
一起使用请阅读下面的 MVCE。
执行后:
create table t(a timestamp);
insert into t values (sysdate);
insert into t values (sysdate);
insert into t values (sysdate);
select * from t;
我得到:
A
---------------------------
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000
我想得到(手改):
A
---------------------------
18/12/25 04:25:59,1234
18/12/25 04:25:59,7281
18/12/25 04:26:00,1928
真正的问题出现在对过程的不同 CALL
语句中,但上面的示例似乎为我复制了这个问题。
更新
我发现有一个有用的方法是在语句之间放置停顿,但这并不是我想要的:
set pause on;
create table t(a timestamp);
insert into t values (sysdate);
pause
insert into t values (sysdate);
pause
insert into t values (sysdate);
我发现 current_timestamp
可以做到:
drop table t;
create table t(a timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
select * from t;
输出:
A
---------------------------
18/12/25 04:48:54,134000000
18/12/25 04:48:54,142000000
18/12/25 04:48:54,149000000
如文档中所述,the sysdate
function returns a date 只能精确到秒 - 它不支持小数秒。因此,同一秒内的多次调用将始终获得相同的值,并且您不能强制它执行任何其他操作。
您将该日期值放入 timestamp 列,这会导致从一种数据类型到另一种数据类型的隐式转换,但该转换不能 set/create 新的小数秒value - 它保留日期的隐式小数秒,当然它始终为零。
与 sysdate
一样,Oracle 具有 a systimestamp
function, which returns a timestamp with time zone 值 - 并且确实有小数秒。精度受您 运行 所在平台的限制。如果您使用它来填充您的普通时间戳列,那么隐式转换仍然会发生,但您实际上只是丢弃了时区信息。
Oracle 还支持 current_date
and current_timestamp
,它们非常相似 - 除了它们 return 当前会话时区的 date/time,而不是服务器时区的 sys*
个版本。