Столбец даты DB2 со значением по умолчанию последнего дня предыдущего месяца? - PullRequest
2 голосов
/ 29 марта 2011

Я пытаюсь создать таблицу 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)

, который работал отлично. Если кто-то знает более лаконичный синтаксис, не стесняйтесь комментировать.

1 Ответ

3 голосов
/ 29 марта 2011

Я думаю, что синтаксис утверждения правильный. Если я выполню запрос:

select CURRENT_DATE - DAY(CURRENT_DATE) DAYS from sysibm.sysdummy1;

Выполняется и возвращается правильно (28.02.2011, на сегодняшнюю дату 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 не был.

Я думаю, что вы можете достичь желаемого с помощью триггера, который срабатывает после вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...