代码之家  ›  专栏  ›  技术社区  ›  Kamil Gosciminski

强制Oracle的sysdate为多个语句返回不同的值

  •  1
  • Kamil Gosciminski  · 技术社区  · 6 年前

    我想强迫甲骨文 sysdate 函数为单独的语句返回不同的值,就像在Postgres中一样。我已经对文档、网络等本身进行了一些挖掘,但找不到解决这个问题的答案。

    对于这一个来说,文档似乎相当糟糕: 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);
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Alex Poole    6 年前

    如文件所述, the sysdate function 返回A date 它的精度只有秒,不支持小数秒。因此,同一秒内的多个调用将始终获得相同的值,并且不能强制它执行任何其他操作。

    你把那个日期值 timestamp 列,这将导致从一种数据类型到另一种数据类型的隐式转换,但该转换无法设置/创建新的小数秒值-它将隐式小数秒保持在从日期开始的位置,当然始终为零。

    以及 相册 ,甲骨文已经 a systimestamp function ,返回 timestamp with time zone 值-有小数秒。精度受到运行平台的限制。如果使用它来填充普通时间戳列,那么仍然会发生隐式转换,但实际上只是丢弃时区信息。

    Oracle还支持 current_date current_timestamp ,非常相似-只是它们返回当前会话时区中的日期/时间,而不是作为 sys* 版本可以。

        2
  •  2
  •   Kamil Gosciminski    6 年前

    我发现 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