将时间戳值添加到 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>
我最近开始学习 SQL,作为我作业的一部分,我试图解决这个问题:
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>