2011-11-15 48 views
3

好吧,我有一個數據庫表的行與StartDate和EndDate。我需要做的是從中返回消耗時間的塊。需要從MySql數據庫的日期塊數組

因此,例如,如果我有3行如下:

RowID StartDate EndDate 
1  2011-01-01 2011-02-01 
2  2011-01-30 2011-02-20 
3  2011-03-01 2011-04-01 

然後的使用時間塊將是如下:

2011-01-01至2011-02 -20和2011-03-01至2011-04-01

是否有一種簡單的方法從MySql數據庫中提取?歡迎任何建議!

+0

如果我正確理解您的問題,那麼您應該可以使用DATEDIFF函數執行此操作 – Muleskinner

+1

我建議您以任何語言運行SQL查詢都要這樣做。數據庫級別的處理級別通常不是一個好主意 - 不是數據庫本來應該做的。 –

回答

2

看該圖表示一些重疊的時間段

X----|    |--------|   |------X 
    |-------X  X------------X 
         |----|  X----| 

開頭或任何連續的時間段的結束時,標有X不屬於任何其他時間段的內部。如果我們確定這些時間,我們可以取得一些進展。

該查詢標識邊界。

SELECT boundary FROM 
(

-- find all the lower bounds 
    SELECT d1.StartDate AS boundary, 'lower' as type 
    FROM dates d1 
    LEFT JOIN dates d2 ON ( 
     d1.StartDate > d2.StartDate 
     AND 
     d1.StartDate < d2.EndDate 
    ) 
    WHERE d2.RowId IS NULL 
    GROUP BY d1.StartDate 

UNION 

-- find all the upper bounds 
    SELECT d1.EndDate AS boundary, 'upper' as type 
    FROM dates d1 
    LEFT JOIN dates d2 ON ( 
     d1.EndDate > d2.StartDate 
     AND 
     d1.EndDate < d2.EndDate 
    ) 
    WHERE d2.RowId IS NULL 
    GROUP BY d1.StartDate 
) as boundaries 

ORDER BY boundary ASC 

您的數據這個查詢的結果是

boundry | type 
------------------ 
2011-01-01 | lower 
2011-02-20 | upper 
2011-03-01 | lower 
2011-04-01 | upper 

日期範圍你是abouve顯示連續的上限和下限之間之後。通過一些後期處理,可以很容易地找到它們。

+0

謝謝你們,找到了解決辦法!正如前面所建議的,我是用PHP而不是MYSQL來完成的。 – Simon