1

Oracle 10 SQL 的小入门级问题。我正在创建一个包含“日期”类型列的表,该列应该包含如下所示的值:“00:00”。我有一个约束,检查时间在 00:00 到 23:00 之间。

现在,我不太明白如何解决这个问题。我确实觉得我错过了一些非常基本的东西,但我无法弄清楚是什么......

我是否:

1)提取并检查我的约束内的日期?如果是这样,有没有办法做到这一点?我可以插入如下所示的数据:TO_DATE('13-AUG-66 12:56','DD-MON-YY HH:MI'),并在我的约束中使用某种“提取”函数吗?

2)有问题的练习确实提到了该特定列的日期类型。默认情况下,我假设它不保留时间并且需要使用 alter_session 进行修改?

4

2 回答 2

2

约束仅强制执行限制。它不能修改数据。触发器可以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;

ADATE总是包含一天和一个时间组件。您的客户可能会或可能不会显示任何一个组件。许多客户端将使用隐式数据类型转换,在这种情况下,会话NLS_DATE_FORMAT控制如何将 aDATE转换为 aVARCHAR2以及将哪些元素合并到字符串中。

于 2013-10-24T04:16:48.870 回答
0

日期类型始终具有日期部分和时间部分。它只是一个值,因此没有格式。例如,是否将时间显示为 22:50 或 10:50 由您决定。您要么依靠 to_char(mydate) 的设置,要么指定格式 to_char(mydate,'hh24: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;

为避免在 23 小时后插入时间,您将编写一个检查约束:

alter table datetable add constraint check_datetable_timepart check ( to_char(mydate, 'hh24:mi') <= '23:00' );
于 2013-10-24T06:14:25.457 回答