【问题标题】:DB2 Date column with default of last day of previous month?DB2 日期列默认为上个月的最后一天?
【发布时间】:2011-03-29 17:21:22
【问题描述】:

我正在尝试创建一个带有日期列的 db2 表,其中默认值是上个月的最后一天。在创建表语句中,我将列定义为:

"CLOSE_DATE" DATE NOT NULL WITH DEFAULT DATE(CURRENT_DATE - DAY(CURRENT_DATE) DAYS),

但我收到一个错误:

SQL0104N 意外标记“- DAY(CURRENT_DATE) 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)

效果很好。如果有人知道更简洁的语法,请随时发表评论。

【问题讨论】:

  • 我意识到这是一个旧的(呃)帖子,但我想我会指出(至少在 LUW 9.7 中),有一个 LAST_DAY 函数将给出最后一天基于日期表达式的月份(例如,LAST_DAY(CURRENT_DATE))不幸的是,DEFAULTs 仍然不允许除内置转换函数之外的任何函数(请参阅SQLCODE -574 上的原因代码 7)。

标签: db2


【解决方案1】:

我认为语句的语法是正确的。如果我运行查询:

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

test 已创建,test2 未创建。

我认为您可以使用插入后触发的触发器来完成您想要的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2012-02-29
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多