Informix 7.3 - 在插入/更新时声明日期列数据类型,默认为当前日期

时间:2010-12-16 19:05:51

标签: sql datetime date timestamp informix

再次寻求帮助Jonathan Leffler

我正在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%确定它是否受支持,但如果有办法,我很想知道。

我在这个主题上找到的唯一好的领导是here

任何人有任何想法/解决方案吗?

<小时/> 更多调查结果:
http://www.4js.com/techdocs/genero/fgl/devel/DocRoot/User/DatabaseSchema.html
Cast Date in Informix

我在另一个表def中找到了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}

3 个答案:

答案 0 :(得分:7)

我不认识问题中使用的元语言,所以我不确定与DBMS的能力相比有什么能力。

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操作中指定它,将为4个时间列中的每一个分配一个默认值:

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

另一方面,如果指定列,则指定的值优先。我假设DBDATE =&#34; Y4MD - &#34;以便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上的值,这样您就可以插入日期并且最后一次更新&#39;列(和whodunnit列 - created_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 :(得分:1)

这是经过测试的&amp;适合我 - 仅适用于插入。我假设您可以使用触发器处理更新方案,如果您需要在每次更新时将字段更新为当前日期

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

答案 2 :(得分: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列上使用WITHOUT NULL,因为在时间列上指定WITHOUT NULL时,最好有一个缺席值而不是12/31/1899。