Установите метку времени UTC в качестве значения по умолчанию для столбца в DB2 - PullRequest
0 голосов
/ 07 мая 2019

Я хочу использовать метку времени UTC в качестве значения по умолчанию для столбца TIMESTAMP.Мы используем DB2 9.5 в Linux

. Мне известно об использовании CURRENT TIMESTAMP, но он предоставляет локальное время сервера DB2 (например, CEST).В запросах вы можете использовать

SELECT JOB_ID, (CURRENT TIMESTAMP - CURRENT TIMEZONE) as tsp FROM SYSTEM_JOBS;

, но это не работает в определении столбца

ALTER TABLE SYSTEM_JOBS ALTER COLUMN CREATED SET DEFAULT CURRENT TIMESTAMP - CURRENT TIMEZONE

[42601][-104] An unexpected token "ALTER TABLE SYSTEM_JOBS ALTER COLUMN CREAT" was found following "BEGIN-OF-STATEMENT".  Expected tokens may include:  "<values>".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.23.42

Я также попытался определить функцию, которая выполняет вычисления.

CREATE OR REPLACE FUNCTION UTCTIMESTAMP ()
    RETURNS TIMESTAMP
    LANGUAGE SQL
    DETERMINISTIC
    NO EXTERNAL ACTION

    BEGIN ATOMIC
    DECLARE L TIMESTAMP;
    DECLARE U TIMESTAMP;
    SET L = CURRENT TIMESTAMP;
    SET U = L - CURRENT TIMEZONE;

    RETURN U;
    END
;

Но это также не принимается в определении столбца

ALTER TABLE SYSTEM_JOBS ALTER COLUMN CREATED SET DEFAULT UTCTIMESTAMP();

[42894][-574] DEFAULT value or IDENTITY attribute value is not valid for column "CREATED" in table "DB2INST1.SYSTEM_JOBS".  Reason code: "7".. SQLCODE=-574, SQLSTATE=42894, DRIVER=4.23.42

Я ищу метод для установки значения по умолчанию в нейтральном UTC.

1 Ответ

1 голос
/ 07 мая 2019

Вы не можете использовать выражения в предложении DEFAULT.См. Описание default-clause оператора CREATE TABLE .
Вместо этого можно использовать триггер BEFORE INSERT, например, для достижения той же функциональности:

CREATE TABLE SYSTEM_JOBS (ID INT NOT NULL, CREATED TIMESTAMP NOT NULL) IN USERSPACE1;

CREATE TRIGGER SYSTEM_JOBS_BIR
BEFORE INSERT ON SYSTEM_JOBS
REFERENCING NEW AS N
FOR EACH ROW
WHEN (N.CREATED IS NULL)
SET CREATED=CURRENT TIMESTAMP - CURRENT TIMEZONE;

INSERT INTO SYSTEM_JOBS(ID) VALUES 1;
...