Лучше всего использовать, возможно, для 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;
Спасибо. Поэтому я мог бы попробовать это. http://pastie.org/10709077 –