2009-11-23 38 views
19

在一个字段中,我不需要存储日期时间对,即标准的Oracle日期。如何只存储时间;不是日期和时间?

01/10/2009 22:10:39 

但时间只有

22:10:39 

我认为节省磁盘空间(我有2万行)或提供更快的处理速度。

+3

检查在事物的宏伟计划,200万行是几乎没有什么。微薄的节省空间是否值得精确度的损失? – kurosch 2009-11-23 22:28:44

+1

我想我应该问的问题是“更快处理什么?”如果你只有一天的时间,你就无法可靠地将它与其他任何东西进行比较,所以你可以不存储任何东西,并保存每行7个字节。 – kurosch 2009-11-23 22:42:19

回答

10

你可以尝试INTERVAL DAY TO SECOND数据类型,但它赢得不会为您节省任何磁盘空间......但它非常适合于此目的。

create table t1 (time_of_day interval day (0) to second(0)); 

insert into t1 values (TO_DSINTERVAL('0 23:59:59')); 

select date '2009-05-13'+time_of_day 
from t1; 

虽然是11个字节。

6

您最好的选择可能是将“自午夜以来的秒数”存储为数字字段。

SELECT to_char(SYSDATE, 'SSSSS') FROM dual; 
+1

当然,你必须考虑以下因素:(1)总是转换价值的表现惩罚;(2)对于其他标准日期算术使用奇怪计算的发展时间惩罚。 – jva 2009-11-24 13:59:49

+0

@jva:是的,我想提到,但当我想到它时,我觉得这个线程已经死了,所以为什么要麻烦 – kurosch 2009-11-24 14:31:47

+1

我喜欢这种方法,但值得一提的是两件事。数据应该存储在一个数字中,以确保不能插入字符,并且列上应该有一个检查约束,确保在秒内输入的时间不能超过24小时。 – Ben 2013-02-23 21:20:32

2

您可以从日期提取时间,像这样的字符串:

to_char(sysdate,'HH.MI.SS') 

但没有时间,唯一的数据类型,这将有助于您节省空间。

+0

如果将它作为VARCHAR存储任何东西都可以存储在列中,这在尝试再次取出时不是很有用。 – Ben 2013-02-23 21:19:26

0

您将节省几Mb的磁盘空间(现在没有什么),并且您在性能上几乎没有任何好处。

您可以使用NUMBER类型的列来存储建议的自午夜以来的秒数,只是不要忘记约束条件。
(你可能会使用NUMBER(5, 0)它使用依赖于存储值1-3个字节,而不是由DATE列使用恒定的7个字节)

0

你可以使用:

TO_CHAR(<DATE_COLUMN>, '<TIME_FORMAT>'); 

例如

TO_CHAR(SYSDATE, 'HH24:MI:SS'); 

时间格式,你可以在here

相关问题