社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

mysql query-one table-find two dates within one day-of the same entity from differ column+diff calculations(mysql查询-一个表-一天内查找两个日期-来自不同列的同一实体+差异计算)

Adam • 4 年前 • 1049 次点击  

我正试图构造一个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;

谢谢你的帮助! 亚当

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39814
 
1049 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Paul Spiegel
Reply   •   1 楼
Paul Spiegel    5 年前

你可以从这里开始:

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

Demo

查询连接一行,该行的值为 IN 同一个人的下一行 OUT . 这假设 id 是自动递增主键,数据正确。

现在可以将其更改为按查询分组。

Elanochecer
Reply   •   2 楼
Elanochecer    5 年前

对保罗每天提供的分钟数查询的改进是:

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;

DEMO MONTH