我正在尝试创建一个带有日期列的db2表,其中默认值是上个月的最后一天。在create table语句中,我将列定义为:
"CLOSE_DATE" DATE NOT NULL WITH DEFAULT DATE(CURRENT_DATE - DAY(CURRENT_DATE) DAYS),
但是我收到了一个错误:
SQL0104N意外的令牌“ - 天(当天时间)DAYS“被发现了 遵循“LT DATE(CURRENT_DATE”)。 预期的代币可能包括: “”。 SQLSTATE = 42601
这是不允许的,还是我有一些语法错误?
更新 - 我用过:
CREATE TRIGGER TRIGGER_NAME AFTER INSERT ON SCH.TABLE FOR EACH ROW
UPDATE SCH.TABLE SET CLOSE_DATE = DATE(CURRENT_DATE - DAY(CURRENT_DATE) DAYS)
效果很好。如果有人知道更简洁的语法,请随时发表评论。
答案 0 :(得分:3)
我认为该陈述的语法是正确的。如果我运行查询:
select CURRENT_DATE - DAY(CURRENT_DATE) DAYS from sysibm.sysdummy1;
它正确执行并返回(2011年2月28日,今天3月29日)。
虽然我找不到任何明确表示默认值中不允许使用数学函数的内容,但db2 CREATE TABLE语法图对于默认值看起来像这样,并且未列出函数:
default-values
|--+-constant-------------------------------------------+-------|
+-datetime-special-register--------------------------+
+-user-special-register------------------------------+
+-CURRENT SCHEMA-------------------------------------+
+-NULL-----------------------------------------------+
'-cast-function--(--+-constant------------------+--)-'
+-datetime-special-register-+
+-user-special-register-----+
'-CURRENT SCHEMA------------'
我也尝试过以下测试:
create table test (
test_column integer with default 1
);
create table test2 (
test_column integer with default (2 - 1)
);
测试已创建,test2未创建。
我认为你可以通过插入后触发的触发器来完成你想要的任务。