Informix 7.3 - Объявление типа данных столбца даты со значением по умолчанию в качестве текущей даты при вставке / обновлении - PullRequest
1 голос
/ 16 декабря 2010

Снова в поисках помощи Джонатан Леффлер !

Я создаю таблицу в Informix 7.3 и мне нужно поле метки времени, которое по умолчанию будет today при вставках и обновлениях.

Как определить столбец даты / даты / времени для таблицы со значением по умолчанию для текущего времени?

Вот определение поля для простого поля даты:

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

Существует также другой синтаксис в файлах схемы, в которых есть комментарии о том, что по умолчанию должно быть :

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

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

Я не уверен ни в каких других таблицах, которые имеют эту функциональность, и я даже не уверен на 100%, что она поддерживается, но если есть способ, я хотел бы знать.

Единственный хороший вывод, который я нашел по этой теме, - здесь

У кого-нибудь есть идеи / решения?


Дополнительные выводы:
http://www.4js.com/techdocs/genero/fgl/devel/DocRoot/User/DatabaseSchema.html
Дата трансляции в Informix

Существует тип столбца datetime, который я нашел в другой таблице def:

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}

Ответы [ 3 ]

7 голосов
/ 17 декабря 2010

Я не распознаю метаязык, использованный в вопросе, поэтому я не уверен, на что он способен по сравнению с тем, на что способна СУБД.

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
);

Это дает вам таблицу, в которой каждому из 4 временных столбцов будет присвоено значение по умолчанию, если вы не укажете его в операции INSERT:

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

С другой стороны, если вы укажете столбцы, указанные значения имеют приоритет. Я предполагаю, DBDATE = "Y4MD-", чтобы значения DATE выглядели как значения DATETIME YEAR TO DAY:

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, чтобы вы могли вставить дату и столбец «последнего обновления» (и столбцы whodunnit - create_by и updated_by - если хотите). Опять же, вам нужно беспокоиться о значениях по умолчанию, а не о явно предоставленных значениях.

Теперь, так как вы используете IDS 7.3x, который, наконец, вышел из строя год или два назад, у вас есть немного отличные функциональные возможности от того, что доступно в 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;

Веселись!

1 голос
/ 17 декабря 2010
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

ПРИМЕЧАНИЕ. Я никогда не использую WITHOUT NULL в столбце DATE или DATETIME, поскольку лучше иметь отсутствующее значение, а не 31.12.1999, когда WITHOUT NULL указан для временного столбца.

1 голос
/ 16 декабря 2010

Это проверено и работает для меня - ТОЛЬКО ДЛЯ ВСТАВКИ.Я предполагаю, что вы можете обработать сценарий обновления с помощью триггера, если вам нужно, чтобы поле обновлялось до текущей даты при каждом обновлении

column use_date date default today not null
        comments ""
        desc "Date this use case was executed"
        heading "Usage date"
        text "Usage date"
        attributes
     (
     )
...