在oracle中插入一个时间值

insert a time value in oracle

我创建了一个这样的table

CREATE TABLE flights_info 
( flight_id number(10) NOT NULL,
  Train_no number(10) NOT NULL,
  station varchar2(50) NOT NULL,
  depature_time date NOT NULL,
  arrival_time date NOT NULL,
  seats_number number(10) NOT NULL, 
  seats_reserved number(10) NOT NULL, 
 flight_date date NOT NULL,
  CONSTRAINT flight_id PRIMARY KEY (flight_id )
);

字段 depature_time 和 arrival_time 应该表示时间值 所以我尝试使用这个脚本插入

INSERT INTO flights_info (flight_id,Train_no,station,depature_time,arrival_time,seats_number,seats_reserved,flight_date) VALUES
(1,1,'Station01', to_date('8:00','hh:mi'),to_date('10:00','hh:mi'),30,10, date '2022-05-14');

但我不明白为什么我得到的是日期数据而不是时间。

输出 outputs

我不确定哪里出了问题

A DATE 数据类型是二进制数据类型,由 7 个字节组成,分别表示:世纪、year-of-century、月、日、小时、分钟和秒。它 ALWAYS 具有所有这些组件,即使您只设置其中一些组件,其他组件也会设置默认值。

  • 当前年月。
  • 一个月的第一天。
  • 零小时、分钟和秒。

所以如果你使用:

SELECT to_date('8:00','hh:mi') FROM DUAL;

然后您将得到当前月份和年份的第一天的日期,上午 8 小时零分秒。

I don't why I got date data instead of time.

因为您用来显示 DATE 值的客户端应用程序设置为仅显示 DATE 的日期部分而不显示时间部分。

对于 SQL*Plus 和 SQL Developer,默认格式由 NLS_DATE_FORMAT 会话参数设置,您可以使用以下参数进行更改:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

对于其他客户端应用程序,您需要查看它们的首选项(或文档)以了解默认日期格式的设置方式。

如果你只想显示时间组件然后使用:

SELECT TO_CHAR(arrival_time, 'HH24:MI:SS') AS arrival_time
FROM   flight_info;

注意:HHHH12 格式模型适用于 12 小时制。您可能需要 HH24 作为 24 小时制。


如果要存储没有日期的时间,请使用 INTERVAL DAY(0) TO SECOND(0) 数据类型。

CREATE TABLE flights_info(
  flight_id      number(10) NOT NULL,
  Train_no       number(10) NOT NULL,
  station        varchar2(50) NOT NULL,
  depature_time  INTERVAL DAY(0) TO SECOND(0) NOT NULL,
  arrival_time   INTERVAL DAY(0) TO SECOND(0) NOT NULL,
  seats_number   number(10) NOT NULL, 
  seats_reserved number(10) NOT NULL, 
  flight_date    date NOT NULL,
  CONSTRAINT flight_id PRIMARY KEY (flight_id )
);

然后:

INSERT INTO flights_info (
  flight_id,
  Train_no,
  station,
  depature_time,
  arrival_time,
  seats_number,
  seats_reserved,
  flight_date
) VALUES (
  1,
  1,
  'Station01',
  INTERVAL '08:00:00' HOUR TO SECOND,
  INTERVAL '10:00:00' HOUR TO SECOND,
  30,
  10,
  date '2022-05-14'
);

然而,虽然这看起来是个好主意,但您可能确实希望使用日期和时间,以便当航班跨越 two-or-more 天时,您可以记录到达和离开的日期和时间(并且您不需要 flight_date 列,因为它将存储在 arrival_timedeparture_time 列中。