将时间戳值添加到 table

Adding time stamp values to a table

我最近开始学习 SQL,作为我作业的一部分,我试图解决这个问题: 我创建的 table 结构是:

CREATE TABLE train (train_no int,date_of_dep date,time_of_dep timestamp,time_of_arrival timestamp)

我正在尝试插入从现在起 33 分钟后出发、115 分钟后到达的火车记录。

这是我正在尝试使用的命令:

INSERT INTO train VALUES(5,SYSDATE,TO_TIMESTAMP(SYSDATE+33/1440),TO_TIMESTAMP(SYSDATE+115/1440))

在显示 table 时,它给了我这个输出:

谁能解释为什么我没有得到所需的输出?

因为 Oracle 中没有 TIME 数据类型,而且您需要收集最多 分钟 的信息(您当然不需要小数秒;是吗? ), 使用 DATE 数据类型,因为它包含日期和时间信息。

此外 - 尽管您的任务说您确实需要它 - 但您不需要 出发日期;它包含在出发时间

像这样:

SQL> CREATE TABLE train
  2  (
  3     train_no          INT,
  4     time_of_dep       DATE,
  5     time_of_arrival   DATE
  6  );

Table created.

插入一行;请注意,指定要插入的所有列是一个好习惯。您可以按照您尝试的方式添加分钟数,但是 - 为什么不使用 interval?更容易理解你在做什么:

SQL> INSERT INTO train (train_no, time_of_dep, time_of_arrival)
  2          VALUES (5,
  3                  SYSDATE + INTERVAL '33' MINUTE,
  4                  SYSDATE + INTERVAL '115' MINUTE);

1 row created.

好的,所以 - 插入了什么?

SQL> SELECT SYSDATE, t.*
  2    FROM train t;

SYSDATE    TRAIN_NO TIME_OF_ TIME_OF_
-------- ---------- -------- --------
11.02.22          5 11.02.22 11.02.22

糟糕!不是很有用。所以——修改日期格式:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';

Session altered.

SQL> SELECT SYSDATE, t.*
  2    FROM train t;

SYSDATE            TRAIN_NO TIME_OF_DEP      TIME_OF_ARRIVAL
---------------- ---------- ---------------- ----------------
11.02.2022 08:33          5 11.02.2022 09:05 11.02.2022 10:27

SQL>

看起来好多了。

或者,您可以使用具有所需格式掩码的 TO_CHAR 函数:

SQL> select train_no,
  2    to_char(time_of_dep    , 'dd.mm.yyyy hh24:mi') dep,
  3    to_char(time_of_arrival, 'dd.mm.yyyy hh24:mi') arr
  4  from train;

  TRAIN_NO DEP              ARR
---------- ---------------- ----------------
         5 11.02.2022 09:05 11.02.2022 10:27

SQL>

[编辑] 如果它必须是 timestamp,你也会这样做:

SQL> CREATE TABLE train
  2  (
  3     train_no          INT,
  4     time_of_dep       timestamp,
  5     time_of_arrival   timestamp
  6  );

Table created.

SQL> INSERT INTO train (train_no, time_of_dep, time_of_arrival)
  2          VALUES (5,
  3                  systimestamp + INTERVAL '33' MINUTE,
  4                  systimestamp + INTERVAL '115' MINUTE);

1 row created.

SQL> SELECT SYSDATE, t.*
  2    FROM train t;

SYSDATE            TRAIN_NO TIME_OF_DEP               TIME_OF_ARRIVAL
---------------- ---------- ------------------------- -------------------------
11.02.2022 08:57          5 11.02.22 09:30:35,783378  11.02.22 10:52:35,783378

SQL>