Как вычислить разницу дат если они в одном столбце?

Имею таблицу

id_заявки статус_заявки время_изменения_статуса_заявки
a11f00 взята в работу 05:00:00
a11f00 закрыта 05:02:00

Я хочу вычислить время отработки заявки, т.е. найти разность (время закрытия - время взятия в работу), то есть 05:02:00 - 05:00:00. Какой скрипт могу написать? Или это можно сделать в Excele?


Ответы (2 шт):

Автор решения: vikttur_Stop_RU_war_in_UA

Или это можно сделать в Excele?

Можно, и довольно просто:

=ЕСЛИ(B2="закрыта";C2-ВПР(A2;$A$2:C2;3;);)

введите сюда описание изображения

Заявка не может быть закрыта, если ранее не взята в работу (т.е. выше обязательно есть строка с номером заявки). Если до закрытия могут быть и другие (промежуточные) статусы, время будет считаться от верхней строки с номером заявки.

→ Ссылка
Автор решения: Superproger77

Заметил в самом конце (когда уже написал решение на PostgreSQL) что используете MySQL. Поэтому у меня решение и на PostgreSQL и на MySQL.

MySQL

-- Создание таблицы Время
CREATE TABLE Заявки
(
    id_заявки VARCHAR(10),
    статус_заявки VARCHAR(14),
    время_изменения_статуса_заявки TIME
);

-- Добавление новых записей в таблицу Время
-- Для наглядности добавил еще несколько записей о других заявках
INSERT INTO
Заявки (id_заявки, статус_заявки, время_изменения_статуса_заявки)
VALUES ('a11f00', 'взята в работу', '05:00:00'),
('a11f00', 'закрыта', '05:02:00'),
('a11f11', 'взята в работу', '06:00:00'),
('a11f11', 'закрыта', '06:08:00'),
('a11f22', 'взята в работу', '06:55:10'),
('a11f22', 'закрыта', '07:08:00'),
('a11f33', 'взята в работу', '08:12:23'),
('a11f33', 'закрыта', '08:55:49'),
('a11f44', 'взята в работу', '09:01:02'),
('a11f44', 'закрыта', '23:33:44');

-- Посчитать время в работе
SELECT SUBTIME(t2.время_изменения_статуса_заявки, t1.время_изменения_статуса_заявки) AS Время_в_работе
FROM Заявки t1 JOIN Заявки t2 USING (id_заявки) 
WHERE t1.статус_заявки = 'взята в работу' 
  AND t2.статус_заявки = 'закрыта';
/*  
-- Посчитать время в работе конкретной заявки 
SELECT SUBTIME(t2.время_изменения_статуса_заявки, t1.время_изменения_статуса_заявки) AS Время_в_работе
FROM Заявки t1 JOIN Заявки t2 USING (id_заявки) 
WHERE t1.статус_заявки = 'взята в работу' 
  AND t2.статус_заявки = 'закрыта' 
  AND id_заявки = 'a11f00';
  
-- Выбрать таблицу целиком
SELECT *
FROM Заявки;
*/

PostgreSQL

-- Создание таблицы Время
CREATE TABLE Заявки
(
    id_заявки VARCHAR(10),
    статус_заявки VARCHAR(14),
    время_изменения_статуса_заявки TIME
);

-- Добавление новых записей в таблицу Время
-- Для наглядности добавил еще несколько записей о других заявках
INSERT INTO
Заявки (id_заявки, статус_заявки, время_изменения_статуса_заявки)
VALUES ('a11f00', 'взята в работу', '05:00:00'),
('a11f00', 'закрыта', '05:02:00'),
('a11f11', 'взята в работу', '06:00:00'),
('a11f11', 'закрыта', '06:08:00'),
('a11f22', 'взята в работу', '06:55:10'),
('a11f22', 'закрыта', '07:08:00'),
('a11f33', 'взята в работу', '08:12:23'),
('a11f33', 'закрыта', '08:55:49'),
('a11f44', 'взята в работу', '09:01:02'),
('a11f44', 'закрыта', '23:33:44');

-- Посчитать время в работе
SELECT t2.время_изменения_статуса_заявки - t1.время_изменения_статуса_заявки AS Время_в_работе
FROM Заявки t1 JOIN Заявки t2 USING (id_заявки) 
WHERE t1.статус_заявки = 'взята в работу' AND t2.статус_заявки = 'закрыта';

/*
-- Посчитать время в работе конкретной заявки
SELECT t2.время_изменения_статуса_заявки - t1.время_изменения_статуса_заявки AS Время_в_работе
FROM Заявки t1 JOIN Заявки t2 USING (id_заявки) 
WHERE t1.статус_заявки = 'взята в работу' 
  AND t2.статус_заявки = 'закрыта' 
  AND id_заявки = 'a11f00';

-- Выбрать таблицу целиком
SELECT *
FROM Заявки;
*/
→ Ссылка