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

时间:2009-11-11 00:26:18

标签: sql oracle timestamp

我发现Oracle存在不一致。 INSERT时间戳data_type值与DATE data_type列的工作方式之间的不一致性与CAST(DATE时间戳)的工作方式相比。

INSERT似乎只是在时间戳值之外切断了毫秒,而CAST将它们向上舍入到最接近的秒。

示例:

  1. TEMP TABLE

    create table test_timestamp_to_date 
    (date_col date, timestamp_col timestamp(6));
    
  2. 插入:

    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;
    
  3. 结果:

    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
    
  4. 问题

    使用CAST时是否有任何简单的方法可以避免四舍五入的舍入? 我不是在谈论使用TO_CHAR,TO_DATE与某些格式的组合;还有别的事吗? 使用CAST进行编码已经完成,但我需要一个非常简单的修复。

2 个答案:

答案 0 :(得分:4)

对任何有兴趣的人。 我只是想通了。

与在PL / SQL中使用CAST相比,ORACLE CAST函数中存在一个错误,使其在SQL中使用CAST时的行为会有所不同。

CAST函数错误地在SQL中使用ROUNDS小数并且在PL / SQL中正确地对它们进行TRUNCATES。

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

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

SQL的CAST应该(并且将在补丁之后)TRUNCATE小数而不是ROUNDING它们。

感谢。

答案 1 :(得分:2)

  

使用CAST时,有没有简单的方法可以避免舍入毫秒?

不,DATE datatype does not have the fractional seconds。只有那种数据类型才能满足您的要求。