2010-09-17 49 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