我在以下结构中有两个表。我想针对每个emp_id使用每个开始日期和结束日期计算总天数。对于所有空的End_date,需要使用当前日期。
我知道DATEDIFF,CURDATE()函数将与某种循环一起使用,但不知道如何使用它来完成所需的输出。
我正在MYSQL的子查询中搜索循环,但是不幸的是,在SO中的一些回答的问题中,提到没有仅循环的循环。因此,请不要在此处发布我的查询版本。
表1
emp_id emp_name
1 AAA
2 BBB
3 CCC
表2
emp_id Start_date End_date
1 05-FEB-2014
1 01-SEP-2012 04-FEB-2014
1 01-OCT-2010 31-AUG-2012
2 13-JAN-2010 28-SEP-2014
2 29-SEP-2014 31-DEC-2018
预期输出
emp_id emp_name Total_days
1 AAA 3030
2 BBB 3273
3 CCC 0
答案 0 :(得分:1)
我了解您想针对与每个员工相关的所有记录计算开始日期和结束日期之间的天差总和。
您确实可以对DATEDIFF和COALESCE使用汇总查询:
SELECT
t1.emp_id,
t1.emp_name,
SUM(
COALESCE(
DATEDIFF(
COALESCE(t2.end_date, CURDATE()),
t2.start_date
),
0
) as total_days
FROM
table1 t1
LEFT JOIN table2 t2
ON t1.emp_id = t2.emp_id
GROUP BY
t1.emp_id,
t1.emp_name
LEFT JOIN避免过滤掉表2中不匹配的记录。 DATEDIFF返回两个日期之间的天数。如果任何日期为NULL,则返回NULL。您可以使用COALESCE进行处理,然后返回0。
答案 1 :(得分:0)
您可以使用“分组依据”进行内部查询,然后使用DATEDIFF
SELECT
Table1.EMP_ID,
Table1.EMP_NAME,
COALESCE(DATEDIFF(end_date, start_date),0) diff
FROM
(
SELECT EMP_ID, MIN(START_DATE) START_DATE, MAX(END_DATE) END_DATE
FROM Table2
GROUP By emp_ID
) t
RIGHT JOIN Table1 ON Table1.emp_id = t.emp_id