我想知道我是否可以存储一个名为flight_time
的字段,这是航班起飞的时间,而不是像其他人建议让我使用错误的数据类型的间隔所需的时间....
我想只存储一个时间而不是当前时间,但是将来我会在一个单独的字段flight_date
中写出日期。
问题
也许我正在接近这个错误,因为我认为你可以将日期存储在那个字段中?
是否有任何数据类型我可以屏蔽格式,但我不想转换任何内容?
使用VARCHAR2
怎么样,因为一旦填充表格,我会以任何方式输入它?
答案 0 :(得分:3)
您应将航班日期和时间值存储为日期类型的单个列。然后,您可以选择如何为UI设置该值的格式。
如果你使用11g,你可以使用虚拟列预先格式化它,例如:
create table t1
( flight_date date,
flight_time as (to_char(flight_date,'HH24:SS:MI')),
flight_day as (to_char(flight_date,'dd/mm/yyyy'))
);
虽然格式化可能应该在您的UI代码中完成。
答案 1 :(得分:1)
Oracle没有时间数据类型的概念。有DATE
,其中包括日期和时间。有TIMESTAMP
,包括小数秒。
Oracle中的日期时间计算是使用一天的单位完成的。所以,SYSDATE+1
明天就是这个时候。 SYSDATE+0.25
从现在起6个小时。如果您希望使用此时间来存储以确定DATE
类型值,则应将其存储为NUMBER
。如果你想要的只是存储一个看似时间的字符串,你可以使用VARCHAR2
,但你也可以存储像66:74这样的荒谬值。
答案 2 :(得分:1)
INTERVAL DAY TO SECOND有一个检查约束,只接受0秒的值,可满足您的需求:
SQL> create table flight (
2 time interval day(0) to second (0),
3 constraint chk_time
4 check(
5 extract(second from time) = 0
6 )
7 )
8 /
Table created
SQL> insert into flight(time)
2 values (interval '10:30' hour to minute)
3 /
1 row inserted
SQL> insert into flight(time)
2 values (interval '10:30:30' hour to second)
3 /
insert into flight(time)
values (interval '10:30:30' hour to second)
ORA-02290: check constraint (ESTCEDAR.CHK_TIME) violated
SQL> insert into flight(time)
2 values (interval '23:30' hour to minute)
3 /
1 row inserted
SQL> insert into flight(time)
2 values (interval '24:30' hour to minute)
3 /
insert into flight(time)
values (interval '24:30' hour to minute)
ORA-01873: the leading precision of the interval is too small
SQL> insert into flight(time)
2 values (interval '1 10:30:30' day to second)
3 /
insert into flight(time)
values (interval '1 10:30:30' day to second)
ORA-01873: the leading precision of the interval is too small
SQL> select *
2 from flight
3 /
TIME
-------------------
+0 10:30:00
+0 23:30:00
SQL>
答案 3 :(得分:0)
因此,您可以将时间存储为0到1之间的浮点数,或者作为0到1439之间的整数分钟数。
在第一种情况下,您可以这样显示:
TO_CHAR(TRUNC(SYSDATE)+ FRACTIME,'HH24:MI:SS')
在第二种情况下,你可以这样显示:
TO_CHAR(TRUNC(SYSDATE)+(MINUTES / 1440),'HH24:MI:SS')
答案 4 :(得分:0)
就个人而言,我会选择一个自定义的对象类型,但那是因为我已经被OO搞砸了。如果你接近它,它会给你很多好处。