расчет разницы во времени в sql

0

Здравствуйте, я пытаюсь создать триггер (или больше), чтобы вычислить разницу во времени в таблице mysql (я использую mysql 5.7.21). У меня есть таблица:

CREATE TABLE people(
username VARCHAR(255) NOT NULL,
state VARCHAR(255) NOT NULL DEFAULT 'not active',
PRIMARY KEY(username)
);

Некоторое объяснение таблицы: столбец имени пользователя не требует пояснений, а столбец состояния получает только 1 из трех значений: "активный", "неактивный", "рабочий". В частности, человек может перейти от "активного" к "неактивному"/"работающему" и наоборот, но не может перейти от "неактивного" к "рабочему" или от "рабочего" к "неактивному". Что я хочу сделать, так это следить за тем, сколько времени у человека было активным/работающим. Теперь у моей идеи есть таблица вроде этого:

Create table Time(
username VARCHAR(255) NOT NULL,
timestarted TIME,
timeended TIME,
timeworking TIME,
FOREIGN KEY (username) REFERENCES people(username)
);

Мое первое предположение заключалось в использовании функции CURRENT_TIME() для отслеживания состояния с использованием триггеров. Что я сделал:

Delimiter $$

CREATE TRIGGER time_calculation
BEFORE Update 
ON people 
FOR EACH ROW BEGIN
DECLARE @times time;
DECLARE @timee time;
DECLARE @timet time;
IF OLD.state = 'not active' THEN
UPDATE Time SET timestart = CURRENT_TIME()  WHERE username = new.username;
END IF;
IF NEW.state = 'not active' THEN
set @times = (select timestarted from time where username = new.username);
set @timee = (select timeended from time where username = new.username);
set @timet = (select timeworking from time where username = new.username);
    UPDATE Time SET timeend = CURRENT_TIME(),timeworking = (TIMEDIFF(times,timee)+timet) WHERE username = new.username;
    END IF;
END$$ 

В соответствии с этим триггером. Каждый раз, когда кто-то переключается с "неактивный" на "активный", таблица времени будет получать текущее время этого переключателя как timestart. Когда кто-то переключается на "неактивный", таблица времени будет получать текущее время как время, и оно добавит разница между timestart и timeend к настройке. Триггер показывает следующую ошибку:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @times time;
DECLARE @timee time;
DECLARE @timet time;
BEGIN
IF OLD.state =' at line 5

Не знаю, что с ним не так. Есть идеи?

  • 0
    Кстати, я бы посоветовал не использовать имя пользователя в качестве ПК
  • 0
    спасибо за это, я неопытный в базах данных Sql, я искал несколько примеров и увидел, что на самом деле большинство баз данных имеют первичный ключ id, но имейте в виду, что это не проблема здесь.
Показать ещё 1 комментарий
Теги:
triggers

1 ответ

0

Ну, я нашел способ решить эту проблему, хотя это было не так, как я ожидал. Я внес некоторые изменения в структуру таблицы следующим образом:

Create table people (
username VARCHAR(255) NOT NULL,
Primary Key (username)
);

Create table characteristics (
username VARCHAR(255) NOT NULL,
state VARCHAR(25) NOT NULL DEFAULT 'not active',
timestart TIME,
timestop TIME,
timetotal TIME NOT NULL DEFAULT '00:00:00',
FOREIGN KEY(username) REFERENCES people(username)
);

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

Delimiter $$

CREATE TRIGGER time_calculation
BEFORE Update 
ON characteristics 
FOR EACH ROW BEGIN
IF OLD.state = 'not active' && NEW.state != 'not active' THEN
SET NEW.timestart = CURRENT_TIME();
END IF;
IF NEW.state = 'not active' && OLD.state != 'not active' THEN
SET NEW.timestop = CURRENT_TIME();
SET NEW.timetotal = ADDTIME(OLD.timetotal,TIMEDIFF(NEW.timestop, OLD.timestart));
END IF;
END$$ 

Delimiter ;

Надеюсь, это поможет любому, у кого такая же проблема со мной!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню