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

INSERT似乎只是从时间戳记值中减去毫秒,而CAST将其舍入到最接近的秒数。

例:

  • TEMP表
    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中错误地舍入小数,并在PL / SQL中正确地将其截断。

    如我们所见,PL / SQL的行为与“默认”转换(插入日期选择时间戳记)的行为相同,这意味着“默认”转换也能正常工作。

    该错误已在11gR2中修复,并且有适用于10g的补丁程序。

    SQL的CAST应该(并且将在补丁之后)截断小数而不是舍入它们。

    谢谢。

    关于sql - Oracle强制转换(时间戳记为日期),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1712208/

    10-12 02:51