我在Oracle中看到不一致的地方。
与CAST(timestamp as DATE)的工作方式相比,INSERT timestamp data_type值插入DATE data_type列的工作方式之间存在不一致。
INSERT似乎只是从时间戳记值中减去毫秒,而CAST将其舍入到最接近的秒数。
例:
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/