2010-12-16 3 views
1

Jonathan Leffler!Informix 7.3 - 삽입/업데이트시 현재 날짜로 기본값이있는 날짜 열 데이터 유형 선언

Informix 7.3에서 테이블을 만들 때 삽입 및 업데이트시 기본값이 today 인 타임 스탬프 필드가 필요합니다.

현재 시간의 기본값이있는 테이블에 대한 날짜/datetime/timestamp 열을 어떻게 정의 할 수 있습니까?

column beg_date date{DEF: date academic session/subsession officially begins} 

    comments "" 
    desc "Beginning date." 
    heading "Beg Date" 
    text "Date - Begin" 
    attributes 
(
) 

:

column upd_date date 
    comments "" 
    desc "Last update date" 
    heading "Last update date" 
    text "Last update date" 
    attributes 
(
) 

기본 해야 것에 대해 의견이있는 스키마 파일에 다른 구문도있다 : 여기

간단한 날짜 필드에 대한 필드 정의입니다 이 기능이있는 다른 테이블에 대해서는 잘 모르겠다. 100 % 확신 할 수는 없지만 방법이 있다면 나는 알고 싶다.

유일한 좋은 리드 나는 here

누구나 어떤 아이디어/솔루션을 가지고있는 주제에 발견했습니다?


더 많은 연구 결과 :
http://www.4js.com/techdocs/genero/fgl/devel/DocRoot/User/DatabaseSchema.html
Cast Date in Informix

내가 데프 다른 테이블에서 발견 datetime 열 유형이있다 : 이것은 나를 위해 & 작품을 테스트

column beg_time datetime year to minute 
    comments "" 
    desc "Beginning date and time of period" 
    heading "Beg Time" 
    text "Date/Time - Slot Begin" 
    attributes 
    (
    ) 
{DEF: date and time this group/person may register} 

답변

7

질문에 사용 된 메타 언어를 인식하지 못하기 때문에 DBMS가 수행 할 수있는 것과 비교할 수있는 것이 무엇인지 잘 모르겠습니다. 이것은 당신이 삽입 작업에 지정하지 않을 경우 4 시간 각 열에는 기본값이 할당됩니다있는 테이블 제공

CREATE TABLE ExampleDatesAndTimes 
(
    rownumber  SERIAL NOT NULL PRIMARY KEY, 
    date_column DATE DEFAULT TODAY NOT NULL, 
    datetime_yd DATETIME YEAR TO DAY 
        DEFAULT CURRENT YEAR TO DAY NOT NULL, 
    datetime_ys DATETIME YEAR TO SECOND 
        DEFAULT CURRENT YEAR TO SECOND NOT NULL, 
    datetime_hs DATETIME HOUR TO SECOND 
        DEFAULT CURRENT HOUR TO SECOND NOT NULL, 
    payload  VARCHAR(255) NOT NULL 
); 

:

INSERT INTO ExampleDatesAndTimes(Payload) VALUES ("Hello"); 

를 다른 한편을, 열을 지정하면 지정된 값이 우선합니다. 그 DATE 값은 DAY 값에 DATETIME의 년처럼 그래서는 DBDate = "Y4MD-을"있으리라 믿고있어 : 여기

INSERT INTO ExampleDatesAndTimes 
    VALUES(0, '1066-10-14', '2001-01-01', '2012-11-10 09:08:07', 
      '23:23:21', "Gezundheit"); 

는, 값이 지정된 모든, 그래서 사람들은 저장된 값이다. ISQL Perform (및 가장 일반적인 I4GL 프로그램)과 같은 프로그램은 모든 열에 값을 제공하므로 기본 메커니즘이 적용되지 않습니다.

트리거와 함께 재생하면 UPDATE에서 값을 변경할 수 있으므로 날짜를 삽입하고 '마지막으로 업데이트 한'열을 사용할 수 있습니다. 원하는 경우 created_by 및 updated_by 열을 추가 할 수 있습니다. 다시 말하면 기본값과 명시 적으로 제공된 값에 대해 걱정해야합니다.

이제 IDS 7.3x를 사용하고 있기 때문에 1 년 또는 2 년 전에는 결국 서비스가 중단되었으므로 IDS 11.70에서 사용할 수있는 것과 약간 다른 기능을 사용하게됩니다. 업그레이드를 고려해야합니다.


업데이트시 트리거로 재생할 때이 코드가 발견되었습니다. 2006 년 날짜.

CREATE TABLE talx_000 
(
    i  SERIAL NOT NULL PRIMARY KEY, 
    s  CHAR(30) NOT NULL, 
    m_user VARCHAR(32) DEFAULT USER NOT NULL, 
    m_time DATETIME YEAR TO SECOND DEFAULT CURRENT YEAR TO SECOND NOT NULL 
); 
CREATE PROCEDURE current_user_time() 
    RETURNING VARCHAR(32) AS m_user, DATETIME YEAR TO SECOND AS m_time; 
    RETURN user(), CURRENT YEAR TO SECOND - 1 UNITS DAY; 
END PROCEDURE; 

CREATE TRIGGER upd_talx_000 UPDATE ON talx_000 
    REFERENCING NEW AS NEW FOR EACH ROW 
    (EXECUTE PROCEDURE current_user_time() INTO m_user, m_time); 

INSERT INTO talx_000(s) VALUES("cached nonsense"); 
INSERT INTO talx_000(s, m_user) VALUES("inserted user", "sphinx"); 
INSERT INTO talx_000(s, m_time) 
    VALUES("inserted time", DATETIME(1066-10-14 15:23:31) YEAR TO SECOND); 
INSERT INTO talx_000(s, m_time, m_user) 
    VALUES("inserted both", DATETIME(1805-10-21 13:15:00) YEAR TO SECOND, 
      "nelson"); 

SELECT * FROM talx_000; 

DROP TRIGGER upd_talx_000; 

CREATE PROCEDURE upd_talx_000(i_val INTEGER); 
    UPDATE talx_000 
     SET m_user = "brandywine", 
      m_time = DATETIME(3019-03-25 13:00:00) YEAR TO SECOND 
     WHERE i = i_val; 
END PROCEDURE; 

CREATE TRIGGER upd_talx_000 UPDATE ON talx_000 
    REFERENCING NEW AS NEW FOR EACH ROW 
    (EXECUTE PROCEDURE upd_talx_000(NEW.i)); 

INSERT INTO talx_000(s) VALUES("cached nonsense"); 
INSERT INTO talx_000(s, m_user) VALUES("inserted user", "sphinx"); 
INSERT INTO talx_000(s, m_time) 
    VALUES("inserted time", DATETIME(1066-10-14 15:23:31) YEAR TO SECOND); 
INSERT INTO talx_000(s, m_time, m_user) 
    VALUES("inserted both", DATETIME(1805-10-21 13:15:00) YEAR TO SECOND, 
      "nelson"); 

SELECT * FROM talx_000; 

재미있게 보내십시오!

+0

감사합니다. jon - 예. 전에 가지고 있던 몇 가지 informix 질문을 업그레이드하는 것에 대해 경고했습니다. 내 전화가 아니지만, 나를 보살펴 주셔서 감사합니다. meta-lang에 관한 한 Jenzabar는 Informix에서 SIS를 작성했으며 기본 프로세스 중 일부는 추가 정보로 인해 – CheeseConQueso

+0

과 같이 변경되었습니다. - 나는 uid, id, 영향을받는 영역, 취해진 조치 등을 가지고 있습니다. .... 그리고 나는 isql을 통해 테스트 삽입을했고 날짜 필드는 자동으로 현재 날짜로 채워졌다. 오늘 나는 업데이 트를 시도하고 그 필드를 수정하지 못했습니다 – CheeseConQueso

+0

btw - wtf는 페이로드 = "Gezundheit"에 대한 hahahah 무엇입니까? – CheeseConQueso

1

- 삽입물에 대해서만. 난 당신이 모든 갱신에 현재 날짜로 업데이트 할 필드를 측정해야 할 필요가있는 경우에는 트리거 업데이트 시나리오를 처리 할 수 ​​있다고 가정

column use_date date default today not null 
     comments "" 
     desc "Date this use case was executed" 
     heading "Usage date" 
     text "Usage date" 
     attributes 
    (
    ) 
1
TABLE sample 
(
timestamp DATETIME(YEAR TO SECONDS) 
) 


In Informix-SQL Perform screen: 

INSTRUCTIONS 

AFTER EDITADD OF sample.timestamp 
LET screen_tag = CURRENT 

AFTER EDITUPDATE OF sample.timestamp 
LET screen_tag = CURRENT 

참고 : 나는 DATE 또는 DATETIME 컬럼 이후에 NULL없이 사용하지 않습니다 WITHOUT NULL이 임시 열에 지정되어있는 경우 1899 년 12 월 31 일과 반대로 부재 값을 갖는 것이 좋습니다.

+1

@FComp - 당신의 말을 듣지 만 기본적으로 삽입시 현재 날짜가 삽입됩니다. 방금 레코드 업데이트를 시도했지만 날짜는 동일하게 유지되었습니다. 나는 트리거가 날짜 업데이 트에 대한 최신 업데이 트를 필요로한다고 가정합니다. – CheeseConQueso

+0

@QuesoConQueso : Si muy bien! .. 당신은 그렇게하기 위해 트리거를 만들 수 있지만, 클라이언트 쪽에서 만 할 수 있다면 EDITADD와 같은 것입니다. EDITUPDATE의 테이블, 더 나은 아직. TRIGGER는 엔진에 많은 오버 헤드를 부과하는 것처럼 보이며 절대적으로 필요한 경우가 아니면 피하려고합니다. –

관련 문제