我发现Oracle存在不一致。 INSERT时间戳data_type值与DATE data_type列的工作方式之间的不一致性与CAST(DATE时间戳)的工作方式相比。
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进行编码已经完成,但我需要一个非常简单的修复。
答案 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。只有那种数据类型才能满足您的要求。