MySQL的Datediff子查询多行

时间:2019-01-19 15:22:41

标签: mysql

我在以下结构中有两个表。我想针对每个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

2 个答案:

答案 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

DB Fiddle