考虑以下SQL指令,我应该更改什么才能仅插入星期几以及像小时和分钟这样的时间:
INSERT INTO SALA_MATERIA(SALA_ID, MATERIA_ID,HORARIO) VALUES (1,'PT', TO_DATE('FRIDAY 15:00','DAY HH24:MI'));
答案 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') );