Mysql-запрос - одна таблица - найти две даты в течение одного дня - одной и той же сущности из разных столбцов + diff вычислений - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь вычислить запрос mysql для вычисления таблицы, содержащей входы и выходы людей в офисе.

Что у меня есть:

id  PERSON      IN                  OUT
1   Person A    2019-03-11 08:59:30 NULL
2   Person B    2019-03-11 08:32:00 NULL
3   Person C    2019-03-11 08:04:40 NULL
4   Person D    2019-03-11 07:58:50 NULL
5   Person E    2019-03-11 07:35:20 NULL
6   Person F    2019-03-11 07:35:00 NULL
7   Person A    NULL                2019-03-11 15:00:50
8   Person B    NULL                2019-03-11 14:57:00
8   Person C    NULL                2019-03-11 13:19:50
9   Person D    NULL                2019-03-11 15:14:20
10  Person E    NULL                2019-03-11 15:15:50
11  Person F    NULL                2019-03-11 15:28:10

Что бы я хотелКак получить:

id  PERSON      IN                  OUT                 DIFF IN MINUTES
1   Person A    2019-03-11 08:59:30 2019-03-11 15:00:50 XXX
2   Person B    2019-03-11 08:32:00 2019-03-11 14:57:00 XXX
3   Person C    2019-03-11 08:04:40 2019-03-11 13:19:50 XXX
4   Person D    2019-03-11 07:58:50 2019-03-11 15:14:20 XXX
5   Person E    2019-03-11 07:35:20 2019-03-11 15:15:50 XXX
6   Person F    2019-03-11 07:35:00 2019-03-11 15:28:10 XXX
                                                        TOTAL OF XXXS
                                                        TOTAL OF XXXS - YYY (constant)

Идея состоит в том, чтобы получить информацию о времени, проведенном в офисе в течение одного дня.Кроме того, мне нужно резюме минут за весь месяц на человека.Группировка на человека / в месяц.

Я потратил некоторое время и пользуюсь этим запросом, но эффект посредственный:

SELECT a.PERSON, a.IN, b.OUT, TIMESTAMPDIFF(SECOND,a.IN,b.OUT)-28880 AS WHATSLEFT
FROM presence a
INNER JOIN presence b
ON a.PERSON = b.PERSON
WHERE DATEDIFF(a.IN,b.OUT) = 0 AND b.PERSON ="Person A"
ORDER BY a.IN;

Спасибо за помощь!Адам

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

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

SELECT 
    a.PERSON, 
    a.IN, 
    b.OUT, 
    TIMESTAMPDIFF(MINUTE,a.IN,b.OUT) AS `DIFF IN MINUTES`
FROM presence a
INNER JOIN presence b ON ( a.PERSON = b.PERSON )
WHERE DAY(a.IN) = DAY(b.OUT)
ORDER BY a.IN;

DEMO DAY

Запрос для моли будет выглядеть так:это:

SELECT 
    a.PERSON, SUM( TIMESTAMPDIFF(MINUTE,a.IN,b.OUT) ) AS `MINUTES`
FROM presence a
INNER JOIN presence b ON ( a.PERSON = b.PERSON )
WHERE DAY(a.IN) = DAY(b.OUT)
AND a.PERSON = 'Person A'
AND a.IN BETWEEN '2019-03-01' AND '2019-04-01' 
AND b.OUT BETWEEN '2019-03-01' AND '2019-04-01' 
GROUP BY a.PERSON;

ДЕМО-МЕСЯЦ

0 голосов
/ 19 марта 2019

Вы можете начать отсюда:

SELECT a.PERSON, a.IN, b.OUT, TIMESTAMPDIFF(SECOND, a.IN, b.OUT) AS TOTAL
FROM presence a
LEFT JOIN presence b ON b.id = (
  SELECT MIN(b2.id)
  FROM presence b2
  WHERE b2.PERSON = a.person
    AND b2.id > a.id
    AND b2.OUT IS NOT NULL
)
WHERE a.IN IS NOT NULL
ORDER BY a.IN;

Будет возвращено:

PERSON      IN                      OUT                     TOTAL
-----------------------------------------------------------------
Person F    2019-03-11 07:35:00     2019-03-11 15:28:10     28390
Person E    2019-03-11 07:35:20     2019-03-11 15:15:50     27630
Person D    2019-03-11 07:58:50     2019-03-11 15:14:20     26130
Person C    2019-03-11 08:04:40     2019-03-11 13:19:50     18910
Person B    2019-03-11 08:32:00     2019-03-11 14:57:00     23100
Person A    2019-03-11 08:59:30     2019-03-11 15:00:50     21680

Демо

Запрос присоединяется к строке, котораяимеет значение в IN со следующей строкой от того же человека, который имеет значение в OUT.Предполагается, что id является ПЕРВИЧНЫМ КЛЮЧОМ AUTO_INCREMENT, и ваши данные верны.

Теперь вы можете изменить его на запрос GROUP BY.

...