2013-08-06 2 views
1
mysql> describe break; 
+-------------+----------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-------------+----------+------+-----+---------+----------------+ 
| id   | int(11) | NO | PRI | NULL | auto_increment | 
| start  | datetime | YES |  | NULL |    | 
| end   | datetime | YES |  | NULL |    | 
| duration | datetime | YES |  | NULL |    | 
| date  | datetime | YES |  | NULL |    | 
| employee_id | int(11) | NO | MUL | NULL |    | 
+-------------+----------+------+-----+---------+----------------+ 
6 rows in set (0.00 sec) 

Я бы хотел рассчитать (и обновить) столбец «duration», используя начальные и конечные значения из приведенной выше таблицы. Например:Динамическое обновление столбца базы данных

UPDATE break SET duration=TIMEDIFF(start, end) WHERE employee_id=1; 

Увы, это устанавливает столбец продолжительность в 0000-00-00 00:00:00

mysql> select * from break\G; 
*************************** 1. row *************************** 
    id: 30 
    start: 2013-08-06 15:43:17 
    end: 2013-08-06 15:55:42 
duration: 0000-00-00 00:00:00 
    date: 2013-08-06 15:43:17 
employee_id: 1 
1 row in set (0.00 sec) 

помощь

+1

Зачем вам хранить эту же информацию дважды? т. е. у вас есть начало и конец, зачем нужно хранить разницу? Также ваш столбец 'duration' не должен быть datetime, потому что это длительность, а не момент времени. Я бы, вероятно, использовал «int» и сохранил количество секунд. – leftclickben

ответ

4

Из documentation (курсив мой):

TIMEDIFF() возвращает expr1 - expr2, выраженное как значение времени.

Изменить duration введите вид TIME и он должен работать.

Обратите внимание, что вы создаете избыточность в своей схеме. Обычно это плохая вещь. Что делать, если end или start изменить, и вы не обновляете duration? Лучше использовать представление и вернуть TIMEDIFF, рассчитанный от end и start оттуда.

2

Изменить durration ввести TIME, а затем обновить ваш код

UPDATE break SET duration=TIMEDIFF(end, start) WHERE employee_id=1; 

или вы будете получать отрицательный результат durration

UPDATE: в ответ на другой ответ вы можете сделать триггер, который устанавливает продолжительность каждого время обновлено:

DROP TRIGGER IF EXISTS `break_trigger`; 
DELIMITER // 
CREATE TRIGGER `break_trigger` AFTER UPDATE ON `break` 
FOR EACH ROW BEGIN 
    SET duration=TIMEDIFF(end, start) WHERE employee_id= NEW.employee_id; 
END 
// 
DELIMITER ; 
+0

Спасибо, я не видел дерева для деревьев. – cookie

+0

Мои намерения состояли в том, чтобы в таблице была какая-то кумулятивная функция. Скажем, суммируя 2, 3 или n разрывов для любого конкретного данного пользователя в любой день. – cookie

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