2

我看到了这个链接这个

如果您指定没有时间分量的日期值,则默认时间为午夜。如果您指定一个不带日期的日期值,则默认日期是当月的第一天。

Oracle DATE 列始终包含日期和时间字段。如果您的查询使用没有时间部分的日期格式,那么您必须确保 DATE 列中的时间字段设置为午夜。

TRUNC()解决方案是对具有日期数据类型的列施加约束,并在插入或更新表中的行时创建触发器(使用)。

如果我使用此解决方案,我是否可以保证 Oracle 在没有时间的情况下确实存储了更少的字节?

使用此标准日期时间类型 Oracle 会产生歧义。创建日期类型(只包含日期)这么难?这是我的意见(我来自 MSSQL)。

4

2 回答 2

7

不,您没有任何保证……无论发生什么,甲骨文都将存储现在是午夜的事实。你不能存储没有时间的日期。

如果您创建下表:

create table a ( dt date);
insert into a values(sysdate);
insert into a values(trunc(sysdate));

然后运行这个查询:

select dt, dump(dt) from a

SQL小提琴

返回的值为:

+-----------------------------+------------------ -----------------+
| DT | 转储(DT) |
+-----------------------------+------------------ -----------------+
| 2013 年 6 月 12 日 18:03:15+0000 | Typ=12 Len=7:120,113,6,12,19,4,16 |
| 2013 年 6 月 12 日 00:00:00+0000 | Typ=12 Len=7: 120,113,6,12,1,1,1 |
+-----------------------------+------------------ -----------------+

DUMP()返回数据类型、字节长度和数据的内部表示。

换句话说,一个带时间的日期和一个被截断的日期,都有 7 个字节。它们的长度相同。


顺便说一句,我建议不要破坏潜在有用的数据,因为您担心空间。

于 2013-06-12T18:06:53.620 回答
1

如果您使用表压缩,仅存储日期可能会节省空间。

这是一个示例,显示仅存储日期可以减小段大小:

create table a (dt date) compress;
create table b (dt date) compress;

--Insert 20 million rows, with time
begin
    for i in 1 .. 20 loop
        insert /*+ append */ into a
        select sysdate + numToDSInterval(level, 'second')
        from dual connect by level <= 1000000;
        commit;
    end loop;
end;
/

--Insert 20 million rows, date only
begin
    for i in 1 .. 20 loop
        insert /*+ append */ into b
        select trunc(sysdate + numToDSInterval(level, 'second'))
        from dual connect by level <= 1000000;
        commit;
    end loop;
end;
/

select segment_name, bytes/1024/1024 MB
from dba_segments
where segment_name in ('A', 'B')
order by segment_name;

SEGMENT_NAME   MB
------------   --
A              256
B              224

Oracle 基本表压缩仅压缩整个值,如果不同的值较少,则压缩可以更好地工作。但永远不要完全相信任何压缩演示——您需要在自己的数据上进行尝试才能确定。这可能是最好的情况,压缩可能根本不会帮助您的数据。

表压缩有很多缺点 - 它需要企业版,DML 速度较慢,您无法向表中添加列等。

此外,正如 Ben 所建议的,您应该使用检查约束而不是触发器来强制执行仅日期规则。它将更简单、更快,并且不会阻止直接路径写入,这是使用基本表压缩所必需的。

于 2013-06-13T05:02:48.123 回答