在 Oracle 中存储时间值 (HH:MM) 的最有效和实用的方法,使其易于搜索

BBl*_*ake 6 oracle

我有一组需要存储在 Oracle 数据库中的开始和结束时间。我需要以一种易于搜索的方式存储它们(即,典型的搜索是查找时间值(例如上午 9:30)落在开始时间和结束时间之间的所有行。在 SQL Server 中,我只会使用 TIME 数据类型字段,但 Oracle 似乎没有等效项。

我看过许多博客和论坛,他们建议只使用 DATE 字段并使用 TO_CHAR 进行转换,然后进行比较,或者将时间值存储为 varchar(4 / HHMM) 或 varchar(6 / HHMMSS) 字段。这两者似乎都不必要地低效。

在 Oracle 中是否有更好或更有效的方法来完成此任务?

Chr*_*xon 5

如果您不需要存储日期组件,那么 aninterval day(0) to second是最实用的方法。如果您需要进行任何计算以找出两次之间经过了多长时间,那么最大的优势就出现了,因为您不需要立即进行任何额外的处理。

例如:

create table times ( t1 interval day(0) to second, t2 interval day(0) to second);

insert into times values ( interval '0 09:30:00' day(0) to second, interval '0 12:30:00' day(0) to second);
insert into times values ( interval '0 10:30:00' day(0) to second, interval '0 13:45:00' day(0) to second);
insert into times values ( interval '0 11:30:00' day(0) to second, interval '0 12:05:01' day(0) to second);

commit;

SELECT * FROM times
where  t1 between interval '0 10:00:00' day to second and interval '0 11:00:00' day to second ;

T1          T2        
----------- -----------
0 10:30:0   0 13:45:0   

SELECT max(t2-t1) FROM times; 

MAX(T2-T1)
-----------
0 3:15:0.0  
Run Code Online (Sandbox Code Playgroud)

您还可以使用标准函数来提取时间的各个组成部分(小时、分钟等):

SELECT extract(hour from t1) hr, extract(minute from t1) mn, extract(second from t1) sec
FROM times; 

        HR         MN        SEC
---------- ---------- ----------
         9         30          0 
        10         30          0 
        11         30          0 
Run Code Online (Sandbox Code Playgroud)