使用Oracle 10 SQL的小入门级问题。我正在创建一个具有“日期”类型的列的表,该列应该保存如下所示的值:"00:00“。我有一个约束,检查从00:00到23:00之间的时间。
现在,我不能完全理解的是如何处理这个问题。我确实觉得我错过了一些很基本的东西,但我不太明白.
我是否:
( 1)提取并检查约束内的日期?如果是的话,有没有办法做到这一点?我是否可以插入如下的数据:TO_DATE(‘13-8月-66 12:56',’DD-MON:MI‘),并在约束中使用某种“提取”函数?
2)有关的练习确实提到该特定栏的日期类型。默认情况下,我假设它不占用时间,需要使用alter_session进行修改?
发布于 2013-10-24 04:16:48
约束只执行限制。它不能修改数据。BEFORE INSERT触发器可以修改数据,但通常比约束效率低。
如果您想要创建一个约束,以确保时间组件总是午夜
CREATE TABLE table_name (
col DATE CHECK( col1 = TRUNC( col ))
);如果您想要创建一个修改数据的触发器
CREATE OR REPLACE TRIGGER trg_trunc_dt
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
:new.date_column := TRUNC( :new.date_column );
END;DATE总是包含一个日期和一个时间组件。您的客户端可能显示或不显示任何组件。许多客户端将使用隐式数据类型转换,在这种情况下,会话的NLS_DATE_FORMAT控制如何将DATE转换为VARCHAR2,以及将哪些元素合并到字符串中。
发布于 2013-10-24 06:14:25
日期类型总是有日期部分和时间部分。它只是一个值,因此没有格式化。例如,如果您显示时间为22:50或10:50,则由您决定。您可以使用to_char(mydate)来依赖您的设置,或者指定格式to_char(mydate,‘mi 24:mi’)。
这就是说,您可以简单地使用列的时间部分而忽略日期部分。如果要避免对存储不同日期的混淆,可以使用触发器将日期部分设置为01.01.0001,例如:
create or replace Trigger trg_datetable_datepart
before insert or update of mydate on datetable
for each row
begin
:new.mydate := to_date( '01.01.0001 ' || to_char(:new.mydate, 'hh24:mi') , 'dd.mm.yyyy hh24:mi' );
end;为了避免在23h之后插入时间,您需要编写一个check约束:
alter table datetable add constraint check_datetable_timepart check ( to_char(mydate, 'hh24:mi') <= '23:00' );https://stackoverflow.com/questions/19556726
复制相似问题