在Oracle日期列中插入星期几和时间

时间:2018-05-04 22:20:54

标签: sql oracle

考虑以下SQL指令,我应该更改什么才能仅插入星期几以及像小时和分钟这样的时间:

INSERT INTO SALA_MATERIA(SALA_ID, MATERIA_ID,HORARIO) VALUES (1,'PT', TO_DATE('FRIDAY 15:00','DAY HH24:MI'));

2 个答案:

答案 0 :(得分:4)

DATE始终包含年,月,日,小时,分钟和秒。试图从一周中的某一天创建一个日期和时间是没有意义的。

如果您只想存储该信息,请使用VARCHAR2列,而不是DATE

如果您想将其存储为DATE,那么您需要指定哪个星期五并指定年,月和日。

答案 1 :(得分:1)

我认为您最好存储整个日期 - 年,月,日和时间 - 然后您只需使用TO_CHAR()EXTRACT()即可获得所需日期的部分内容。要在DATE列中存储星期五,您可以执行以下操作:

INSERT INTO sala_materia
  ( sala_id, materia_id, horario )
VALUES
 ( 1, 'PT', NEXT_DAY(SYSDATE, 'FRIDAY') );

这也将获得当前的时间;使用任意时间你可以截断NEXT_DAY函数的结果,然后使用区间或标准的Oracle日期算术:

INSERT INTO sala_materia
  ( sala_id, materia_id, horario )
VALUES
 ( 1, 'PT', TRUNC( NEXT_DAY(SYSDATE, 'FRIDAY') ) + INTERVAL '15' HOUR );

INSERT INTO sala_materia
  ( sala_id, materia_id, horario )
VALUES
 ( 1, 'PT', TRUNC( NEXT_DAY(SYSDATE, 'FRIDAY') ) + 15/24 );

如果您需要更精细(即分钟和秒),间隔可能会更好一些。

我建议采取此行动而不是仅仅存储一周中某一天和VARCHAR2列中的时间的原因是您可以在显示时使用TO_CHAR()EXTRACT()日期,在比较中使用日期部分等 - 您甚至可以根据应用于horario列的这些函数的结果创建基于函数的索引或虚拟列:

CREATE INDEX mydayofweek ON sala_materia ( TO_CHAR(horario, 'DAY') );