如何仅将小时和分钟插入表中?
Posted
技术标签:
【中文标题】如何仅将小时和分钟插入表中?【英文标题】:How to insert only hour and minute into table? 【发布时间】:2018-10-16 17:05:32 【问题描述】:试过这个:
INSERT INTO Airplanes
VALUES (1, 'Boeing 720-020', 'New York', TO_DATE('17:30', 'HH24:MI'), 219);
但是在运行它之后,在表中我有10/01/2018
而不是17:30
。
非常感谢您的帮助。
【问题讨论】:
oracle 中没有这种“时间”数据类型。 DATE 类型包含月、日、年。也许如果你能更好地解释你想要完成的是什么,我们可以进一步思考。另请参阅here 以获取建议的解决方案。 Ty,我想在我的表中记录一个小时:分钟 @Noktua - 但是一旦你有了这些数据,你将如何处理它?您可以将字符串文字'17:30'
存储在 varchar2
列中,但有人可能会将垃圾放入其中。您可以按原样存储它并忽略日期部分。您的表中没有 10/01/2018,这就是您的客户显示它的方式 - 更改您的 NLS_DATE_FORMAT 或使用 to_char()
来显示存储的时间(或改为)。由于您没有指定日期部分,它实际上将存储当月第一天的 17:30:00。
将值存储为整数分钟数。
【参考方案1】:
Oracle 中的 DATE 实际上是一个日期时间数据类型。没有 TIME 数据类型。因此,如果您只想存储时间,则需要使用字符串。
create table airplane (
id number primary key
, plane_type varchar2(32) not null
, destination varchar2(32) not null
, flight_time varchar2(5) not null check (regexp_like(flight_time, '[0-9]2:[0-9]2'))
)
/
检查约束强制采用99:99
的格式。如果你愿意,你可以更严格。
我对@AlexPoole 表示同情,我们应该使用 DATE 列来存储时间,因为它确实更容易确保只输入有效时间。但是我们必须限制日期部分以确保它始终是相同的魔术日期,并且我们总是必须在查询表时应用格式掩码以确保它只显示时间。所以我们得到了一些东西,但我们也失去了一些东西。
还有更多巴洛克式的解决方案。您可以将 flight_time 定义为间隔:
, flight_time interval day to second
那么您的插入语句将是
insert into airplane
values (1, 'Boeing 720-020','New York',INTERVAL '0 17:30:0' DAY TO SECOND);
您仍然需要检查 DAY 元素是否为零。而且我认为查询的输出仍然需要格式化。
但我怀疑我们开始过度设计看似课程作业的内容。所以除非你需要更好的东西,否则坚持使用字符串,
【讨论】:
【参考方案2】:您可以尝试使用 to_char 函数。
例子:
SELECT TO_CHAR(SYSDATE,'HH24:MI') FROM DUAL;
【讨论】:
OP 不想要当前日期的时间元素。他们希望能够存储没有日期元素的时间【参考方案3】:您可以按照所显示的内容存储时间:
TO_DATE('17:30', 'HH24:MI')
您的表Airplanes
有一个date
数据类型的列(实际上是日期和时间为stated by APC),您尝试在其中存储该时间。您的时间确实被存储了,但它带有一个您没有指定的日期,默认为当月的第一天。
您唯一的问题是 Oracle 向您显示了您 select
ed 的日期。因此,要克服这个问题,只需使用 to_char()
仅以特定格式显示时间,如下所示:
select to_char(column_name,'HH24:MI') from Airplanes;
如果您要走这条路,我建议您也存储那个时间的日期,这样您就不会在记录中留下无用的日期。因此,例如,如果您要存储航班时间,则还要将航班日期存储在同一列中,如下所示:
TO_DATE('2018-10-17 17:30', 'YYYY-MM-DD HH24:MI')
此外,请使用date
数据类型,以便您可以利用内置日期/时间函数,例如轻松地以特定格式显示时间。
【讨论】:
以上是关于如何仅将小时和分钟插入表中?的主要内容,如果未能解决你的问题,请参考以下文章