任何人都可以帮助我..如果可以从oracle默认为sysdate更改日期数据类型的7字节的固定字节类型吗?
我们可以把它改成8吗? bcoz我默认在某处学习它可以是7或8?
请提前帮助和谢谢。
答案 0 :(得分:0)
日期的存储空间大小无法更改。 7到8个字节之间的差异取决于上下文。日期文字或日期表达式使用8个字节,但存储的日期总是使用7个字节。
create table table1(a date);
insert into table1 values(date '2000-01-01');
select
dump(a) variable,
dump(a+1) expression,
dump(sysdate) "SYSDATE",
dump(date '2000-01-01') literal
from table1;
VARIABLE: Typ=12 Len=7: 120,100,1,1,1,1,1
EXPRESSION: Typ=13 Len=8: 208,7,1,2,0,0,0,0
SYSDATE: Typ=13 Len=8: 222,7,7,19,1,18,20,0
LITERAL: Typ=13 Len=8: 208,7,1,1,0,0,0,0
这意味着视图中的DATE
可能看起来是7或8个字节。
create or replace view view1 as
select a a, a+1 a_1, sysdate a_sysdate, date '2000-01-01' a_literal
from table1;
select dump(a), dump(a_1), dump(a_sysdate), dump(a_literal) from view1;
A: Typ=12 Len=7: 120,100,1,1,1,1,1
A_1: Typ=13 Len=8: 208,7,1,2,0,0,0,0
A_SYSDATE: Typ=13 Len=8: 222,7,7,19,1,34,47,0
A_LITERAL: Typ=13 Len=8: 208,7,1,1,0,0,0,0
select column_name, data_type, data_length
from user_tab_columns
where table_name = 'VIEW1';
COLUMN_NAME DATA_TYPE DATA_LENGTH
----------- --------- -----------
A DATE 7
A_1 DATE 8
A_SYSDATE DATE 8
A_LITERAL DATE 8
我之前从未听说过这种DATA_LENGTH
差异造成的问题。如果它确实是导致错误的原因,则可能的解决方法是将列创建为A+0
,而不仅仅是A
。但请记住,将常规列转换为表达式是一个坏主意 - 它可能会对索引访问,分区修剪和优化程序估计产生负面影响。