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