【问题标题】:Informix 7.3 - Declaring a date column data type with default as current date on insert/updateInformix 7.3 - 声明一个日期列数据类型,默认为插入/更新时的当前日期
【发布时间】:2011-05-26 18:04:12
【问题描述】:

再次寻求您的帮助Jonathan Leffler

我正在 Informix 7.3 上创建一个表,并且需要一个时间戳字段,该字段在插入和更新时默认为 today

如何为具有当前时间默认值的表定义日期/日期时间/时间戳列?

这是一个简单日期字段的字段定义:

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

架构文件中还有一些其他语法,其中包含关于默认 应该 是什么的 cmets:

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}

【问题讨论】:

    标签: sql datetime date timestamp informix


    【解决方案1】:

    我不认识问题中使用的元语言,所以我不确定与 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="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 列 - 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;
    

    玩得开心!

    【讨论】:

    • 感谢 jon - 是的,您警告我升级我之前遇到的几个 informix 问题。这不是我的电话,但我感谢你照顾我。就元语言而言,Jenzabar 在 Informix 上构建了他们的 SIS,并且一些本机进程也因此而改变
    • 另外,感谢您提供的额外信息 - 我确实有 whodunnit uid、id、受影响区域、采取的措施等....我通过 isql 进行了测试插入,日期字段自动填充当前日期。今天我尝试了更新,但未能修改字段
    • btw - wtf is payload="Gezundheit" about haha​​hah?
    • btw - 关于元语言,这种语法(我想)是特定于在 Informix 上运行的 Jenzabar CARS cx 系统。表是通过make build F=table_file_name 创建的,而不是直接使用 SQL
    • 感谢您的更新 - 我希望有一天我能回报您的青睐
    【解决方案2】:
    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。

    【讨论】:

    • @FComp - 我听到了,但默认情况下,它会在插入时插入当前日期。我刚刚尝试更新记录,日期保持不变。我想在 sql 更新中将日期字段更新到当前日期需要一个触发器
    • @QuesoConQueso: Si muy bien!.. 你可以创建触发器来做到这一点,但如果你只能在客户端做到这一点,比如在 EDITADD EDITUPDATE OF table 之前,那就更好了。 TRIGGER 似乎会给引擎带来很多开销,除非绝对必要,否则我会尽量避免使用它们。
    【解决方案3】:

    这已经过测试并且适用于我 - 仅适用于插入。如果您需要在每次更新时将该字段更新为当前日期,我假设您可以使用触发器来处理更新场景

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 2019-09-16
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多