在表中只存储HH24:MM格式的时间?可能吗?

时间:2011-12-09 02:33:29

标签: sql database oracle oracle-sqldeveloper

我想知道我是否可以存储一个名为flight_time的字段,这是航班起飞的时间,而不是像其他人建议让我使用错误的数据类型的间隔所需的时间....

我想只存储一个时间而不是当前时间,但是将来我会在一个单独的字段flight_date中写出日期。

问题

也许我正在接近这个错误,因为我认为你可以将日期存储在那个字段中?

是否有任何数据类型我可以屏蔽格式,但我不想转换任何内容?

使用VARCHAR2怎么样,因为一旦填充表格,我会以任何方式输入它?

5 个答案:

答案 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搞砸了。如果你接近它,它会给你很多好处。