Che*_*eso 1 sql informix datetime timestamp date
再次寻找你的帮助Jonathan Leffler!
我在Informix 7.3上创建一个表,需要一个时间戳字段,默认为today插入和更新.
如何为具有当前时间默认值的表定义日期/日期时间/时间戳列?
以下是简单日期字段的字段定义:
column upd_date date
comments ""
desc "Last update date"
heading "Last update date"
text "Last update date"
attributes
(
)
Run Code Online (Sandbox Code Playgroud)
模式文件中还有一些其他语法可以对默认值应该是什么进行评论:
column beg_date date{DEF: date academic session/subsession officially begins}
comments ""
desc "Beginning date."
heading "Beg Date"
text "Date - Begin"
attributes
(
)
Run Code Online (Sandbox Code Playgroud)
我不确定任何其他具有此功能的表格,我甚至不能100%确定它是否受支持,但如果有办法,我很乐意知道.
我在这个主题上找到的唯一好的领导就是这里
任何人有任何想法/解决方案?
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}
Run Code Online (Sandbox Code Playgroud)
我不认识问题中使用的元语言,所以我不确定与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
);
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个表,如果您未在INSERT操作中指定,则将为4个时间列中的每一个分配一个默认值:
INSERT INTO ExampleDatesAndTimes(Payload) VALUES ("Hello");
Run Code Online (Sandbox Code Playgroud)
另一方面,如果指定列,则指定的值优先.我假设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");
Run Code Online (Sandbox Code Playgroud)
这里,所有值均已指定,因此这些值是存储的值.请注意,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;
Run Code Online (Sandbox Code Playgroud)
玩得开心!