Oracle强制转换(时间戳记为日期)

我看到Oracle中的不一致。 与CAST(timestamp as DATE)工作方式相比,INSERT timestamp data_type值到DATE data_type列的工作方式不一致。

INSERT似乎简单地将时间戳值中的毫秒切掉,而CAST将其舍入到最接近的秒。

例:

  • TEMP TABLE

    create table test_timestamp_to_date 
    (date_col date, timestamp_col timestamp(6));
    
  • 插入内容:

    insert into test_timestamp_to_date select 
    to_timestamp('11-OCT-2009 2:23:23.793915 PM'),
    to_timestamp('11-OCT-2009 2:23:23.793915 PM')
    from dual;
    
    insert into test_timestamp_to_date select 
    cast(to_timestamp('11-OCT-2009 2:23:23.793915 PM') as date),
    to_timestamp('11-OCT-2009 2:23:23.793915 PM')
    from dual;
    
  • 结果:

    1* select to_char(date_col,'DD-MON-YYYY HH24:MI:SS') date_col, timestamp_col
         from test_timestamp_to_date
    SQL> /
    
    DATE_COL             TIMESTAMP_COL
    -------------------- ----------------------------
    11-OCT-2009 14:23:23 11-OCT-09 02.23.23.793915 PM
    11-OCT-2009 14:23:24 11-OCT-09 02.23.23.793915 PM
    
  • 有没有简单的方法来避免在使用CAST时舍入几毫秒? 我不是在谈论使用TO_CHAR,TO_DATE与某些格式的组合; 还有别的事吗? CAST编码已经完成,但我需要一个非常简单的解决方案。


    对谁有兴趣。 我只是想出了它。

    ORACLE CAST函数中存在一个错误,使得它在SQL中使用CAST时的行为与在PL / SQL中使用CAST时的行为不同。

    CAST函数SQL中的错误ROUNDS小数部分并正确地在PL / SQL中截断它们。

    正如我们所看到的,PL / SQL的行为与“默认”转换(insert into date select timestamp)的行为方式相同,这意味着“默认”转换也正常运行。

    该错误在11gR2中得到修复,并且有一个补丁可用于10g。

    SQL的CAST应该(并且在修补程序之后)将小数部分截断而不是对其进行ROUNDING。

    谢谢。


    有没有简单的方法来避免在使用CAST时舍入几毫秒?

    不,DATE数据类型没有小数秒。 只有该数据类型中没有办法容纳你所要求的内容。

    链接地址: http://www.djcxy.com/p/36935.html

    上一篇: Oracle cast(timestamp as date)

    下一篇: 00600 when moving tablespace in oracle trigger