2016-02-03 2 views
0

Я пытаюсь создать таблицу на Informix (11.70). Я хочу добавить функцию WEEKDAY к значению datetime в предложении CREATE, чтобы я мог автоматически получить целое число, возвращаемое при вставке данных.Informix - Создать таблицу с функцией weekday

Например.

 CREATE TABLE orders (

    order_num serial 
    order_date datetime year to second 
    order_weekday datetime year to second 
    ) 

Я пробовал следующее и получаю синтаксическую ошибку.

CREATE TABLE orders (

    order_num serial 
    order_date datetime year to second 
    order_weekday WEEKDAY(datetime) year to second 
    ) 

Также этот

CREATE TABLE orders (

    order_num serial 
    order_date datetime year to second 
    WEEKDAY(order_weekday) datetime year to second 
    ) 

Есть ли какой-нибудь способ для достижения этой цели?

ответ

0

Лучше всего использовать, возможно, для FOR EACH ROW triggers, которые назначают столбцу дня недели INSERT и UPDATE с учетом значения в столбце Order-Date.

Как отмечает RET в его answer, часто лучше не хранить производные данные, особенно не такие легко выводимые данные, как в будний день.

Однако, если предположить, что вам нужно сделать это так, то триггер будет выглядеть следующим образом:

BEGIN WORK; 
CREATE TABLE orders 
(
    order_num SERIAL NOT NULL, 
    order_date DATETIME YEAR TO SECOND NOT NULL, 
    order_weekday INTEGER CHECK (order_weekday BETWEEN 0 AND 6) NOT NULL 
); 
INSERT INTO orders VALUES(0, CURRENT YEAR TO SECOND, WEEKDAY(MOD(WEEKDAY(TODAY) + 3, 7))); 
SELECT *, WEEKDAY(order_date) AS calc_weekday FROM orders; 
order_num  order_date  order_weekday calc_weekday 
SERIAL DATETIME YEAR TO SECOND INTEGER SMALLINT 
1  2016-02-04 23:21:36  0  4 
CREATE TRIGGER i_orders INSERT ON orders 
    REFERENCING NEW AS NEW 
    FOR EACH ROW 
    (
     UPDATE orders 
      SET order_weekday = WEEKDAY(NEW.order_date) 
     WHERE order_num = NEW.order_num 
    ); 
CREATE TRIGGER u_orders UPDATE OF order_date ON orders 
    REFERENCING NEW AS NEW 
    FOR EACH ROW 
    (
     UPDATE orders 
      SET order_weekday = WEEKDAY(NEW.order_date) 
     WHERE order_num = NEW.order_num 
    ); 
INSERT INTO orders(order_num, order_date) VALUES(0, CURRENT YEAR TO SECOND); 
SELECT *, WEEKDAY(order_date) AS calc_weekday FROM orders; 
order_num  order_date  order_weekday calc_weekday 
SERIAL DATETIME YEAR TO SECOND INTEGER SMALLINT 
1  2016-02-04 23:21:36  0  4 
2  2016-02-04 23:21:36  4  4 
UPDATE orders 
    SET order_date = order_date - 10 UNITS DAY 
WHERE order_weekday != WEEKDAY(order_date); 
SELECT *, WEEKDAY(order_date) AS calc_weekday FROM orders; 
order_num  order_date  order_weekday calc_weekday 
SERIAL DATETIME YEAR TO SECOND INTEGER SMALLINT 
1  2016-01-25 23:21:36  1  1 
2  2016-02-04 23:21:36  4  4 
ROLLBACK WORK; 
+0

Спасибо. Поэтому я мог бы попробовать это. http://pastie.org/10709077 –

0

Что вы пытаетесь достичь? Это фундаментальный принцип нормирования РСУБД, что вы не должны хранить значение, которое может быть получено из другого существующего поля. Вы можете рассчитать WEEKDAY(order_date) в любое удобное для вас время практически бесплатно.

Однако, если вы действительно хотите это сделать, то вам нужно написать INSERT TRIGGER, так как @JonathanLeffer предложил, пока я писал это.

Возможно, вы также захотите уточнить, что вы подразумеваете под «получить целое число». База данных возвращает что-то успешное INSERT, но вы не можете переопределить это произвольно. Если вы действительно этого хотите, вам нужно написать ПРОЦЕДУРУ, чтобы обработать вставку записи в таблицу orders и вернуть требуемое значение.

 Смежные вопросы

  • Нет связанных вопросов^_^