在Oracle Table中设置仅YYYY字段?

时间:2015-12-29 15:41:17

标签: database oracle date database-design plsql

我正在尝试使用以下字段设置在我的数据库中设置简单的历史记录表:

{{1}}

我似乎无法弄清楚(确定)是如何设置[CALENDAR_YEAR] DATE类型字段以仅包含年份值' YYYY'并且[CREATED_DATE] DATE类型字段仅为日期(无时间值)。任何更有经验的人都可以权衡这个吗?

这是一张新表,但我还有一些其他的表格。声明为DATE的字段,我需要更改为仅包含日期,没有时间。我在oracle文档中已经阅读了很多关于使用TRUNC()在查询时将数据专门作为xyz返回的内容,但是如果可能的话我想直接根据需要存储数据。

1 个答案:

答案 0 :(得分:0)

您可以使用约束来强制执行您的要求,这将阻止输入无效数据,或者您可以使用触发器将插入和/或更新的数据截断为所需的值。

CREATE TABLE TABLE2 
(
  TABLE_ID NUMBER NOT NULL 
, CALENDAR_YEAR DATE NOT NULL 
, CREATED_DATE DATE NOT NULL 
, CREATED_BY NUMBER NOT NULL 
, CONSTRAINT TABLE2_PK PRIMARY KEY ( TABLE_ID ) ENABLE
, CONSTRAINT TABLE2_CHK1 CHECK (CALENDAR_YEAR = TRUNC(CALENDAR_YEAR,'year')) ENABLE
, CONSTRAINT TABLE2_CHK2 CHECK (CREATED_DATE = TRUNC(CREATED_DATE)) ENABLE
);

如果您不包含TABLE2_CHK1和TABLE2_CHK2,则以下触发器将根据需要截断任何插入或更新的值:

create or replace TRIGGER TABLE2_BIU_TRG 
BEFORE INSERT OR UPDATE OF CALENDAR_YEAR,CREATED_DATE ON TABLE2 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
BEGIN
  CASE
    WHEN INSERTING THEN
      :NEW.TABLE_ID := TABLE2_SEQ.NEXTVAL;
    WHEN UPDATING THEN
      IF :NEW.TABLE_ID != :OLD.TABLE_ID THEN
        :NEW.TABLE_ID := :OLD.TABLE_ID;
      END IF;
  END CASE;

  :NEW.CREATED_DATE := trunc(:NEW.CREATED_DATE);
  :NEW.CALENDAR_YEAR := trunc(:NEW.CALENDAR_YEAR,'YEAR');
END;