2010-09-17 59 views
0

我有一个包含日期范围的表。我想寻找这些范围之间的差距。 我已经知道我可以将连接表留给自己并计算其差异。在连接表中排序行mysql

当前表:

date_begin date_end 
2010-08-01 2010-08-15 
2010-08-16 2010-08-30 
2010-08-31 2010-09-12 
2010-10-01 2010-10-15 

我想:

date_begin date_end - date_begin2 DATEDIFF(date_begin2 - date_end) 
           2010-08-01  
2010-08-01 2010-08-15  2010-08-16  ... 
2010-08-16 2010-08-30  2010-08-31  ... 
2010-08-31 2010-09-12  2010-10-01  ... 
2010-10-01 2010-10-15 

我用下面的查询:

SELECT pay1.date_begin, pay1.date_end, 
     pay2.date_begin, pay2.date_end, DATEDIFF(pay2.date_begin, pay1.date_end) 
FROM `payment_employees` AS pay1 
LEFT JOIN `payment_employees` AS pay2 ON pay2.date_begin > pay1.date_end 
GROUP BY pay1.date_begin 
ORDER BY pay1.date_begin ASC 

但结果是

pay1.date_begin date_end pay2.date_begin date_end    difference 
2010-08-01 2010-08-15 2010-08-31 2010-09-12   16 wrong 
2010-08-16 2010-08-30 2010-08-31 2010-09-12   1 correct 
2010-08-31 2010-09-12 2010-10-01 2010-10-15   19 correct 
2010-10-01 2010-10-15 NULL    NULL 

如果我删除GROUP BY,我可以看到结果中有正确的行。我无法弄清楚如何得到它们。

有没有办法在加入之前对表格排序?

回答

2

如果你想在接合之前整理你的表中的行,你可以取代真实的表的一方或双方在参加像这样的派生表...

SELECT pay1.date_begin, 
     pay1.date_end, 
     pay2.date_begin, 
     pay2.date_end, 
     DATEDIFF(pay2.date_begin, pay1.date_end) 
    FROM (SELECT * 
       FROM `payment_employees` 
       ORDER BY date_begin) AS pay1 
      LEFT JOIN (SELECT * 
         FROM `payment_employees` 
         ORDER BY date_end) AS pay2 
      ON pay2.date_begin > pay1.date_end 
    GROUP BY pay1.date_begin 
    ORDER BY pay1.date_begin ASC 

我不知道但是,如果这能解决实质性问题。

+0

是的。我想我会用子查询来做些事情。谢谢 – undsoft 2010-09-17 10:55:56