我有2张桌子
Matricule date presence minutes
248 31/01/2017 500
248 01/02/2017 400
248 02/02/2017 300
第二张表:
matricule date_effet time_passed_project
248 31/01/2017 250
248 31/01/2017 250
248 01/02/2017 300
248 02/02/2017 150
248 02/02/2017 100
我想要提取的是一个员工在项目上工作的日期少于他的存在,因为他知道一个员工可以在一天内在多个项目中工作,或者只在一个项目中工作,例如31/01/2017员工在2个项目中工作250和250,总数是500,就像第一个表一样,但在其余部分它与第一个表不一样,这是我要提取的日期,知道用户将选择一个范围日期例如,在这种情况下可能是2017年2月28日至2017年2月2日之间的日期
答案 0 :(得分:0)
您可以分两步完成此操作。首先,将第二个表中每个日期(对于每个matricule
)花费的总时间聚合为子查询。然后,将此子查询连接到第一个表,并保留那些工作时间小于存在时间的记录,并且匹配的记录也属于您指定的日期范围。
SELECT t1.matricule, t1.date, t1.`presence minutes`
FROM table1 t1
INNER JOIN
(
SELECT matricule, date_effet, SUM(time_passed_project) AS total_time
FROM table2
GROUP BY matricule, date_effet
) t2
ON t1.matricule = t2.matricule AND
t1.date = t2.date_effet
WHERE t2.total_time < t1.`presence minutes` AND
t1.date BETWEEN '2017-01-28' AND '2017-02-02'
使用您提供的示例数据的上述查询的输出是以下两个日期:
01/02/2017
02/02/2017
作为旁注,如果您确实将日期存储为文本,这就是格式化建议的内容,您应该认真考虑使用日期类型,例如datetime
。这样做可以更轻松地处理您的数据。减去WHERE
子句,我的查询甚至可以使用文本日期。如果您的日期确实是文本,则可能必须使用以下内容替换WHERE
子句:
WHERE STR_TO_DATE(t1.date, '%d/%m/%Y') BETWEEN '2017-01-28' AND '2017-02-02'
在这里演示: