如何仅将小时和分钟插入表中?

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 向您显示了您 selected 的日期。因此,要克服这个问题,只需使用 to_char() 仅以特定格式显示时间,如下所示:

select to_char(column_name,'HH24:MI') from Airplanes;

如果您要走这条路,我建议您也存储那个时间的日期,这样您就不会在记录中留下无用的日期。因此,例如,如果您要存储航班时间,则还要将航班日期存储在同一列中,如下所示:

TO_DATE('2018-10-17 17:30', 'YYYY-MM-DD HH24:MI')

此外,请使用date 数据类型,以便您可以利用内置日期/时间函数,例如轻松地以特定格式显示时间。

【讨论】:

以上是关于如何仅将小时和分钟插入表中?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 如何根据将插入数据半小时的表中的几个参数来计算持续时间?

触发仅将变量的 1 个字符插入表中

Oracle 取过去一个小时每分钟的数据应该如何写sql?

如何在 SQL 中的日期时间列中添加小时、分钟和秒?

如果值不存在,则插入连接表

从表中选择所有行并仅将不同的值插入到 C# 中另一个位置的数据库中