2012-07-08 46 views
1

我使用一個自定義的PHP函數產生視覺日曆的單月,基於包含一個起始日期的表,和持續時間阻擋了日期 - 例如:針對預訂日期打破月末的SQL查詢?

Calendar Example

...這是由數據產生的,表中應該從14日開始4天,從27日開始7天。

查詢看起來是這樣的:

SELECT GROUP_CONCAT(DATE_FORMAT(start_date,'%d'),':', event_duration) AS info 
    FROM events 
    WHERE YEAR(start_date = '2012' 
    AND MONTH(start_date) = '07' 
ORDER BY start_date 

(你可以放心地忽略組CONCAT並返回數據作爲單獨的行,這並不重要)。

我正在尋找一個修改的查詢,如果一個事件在上個月開始時會阻止在月初的日期,但它的長度會將其納入以下內容。

例如 - 在上面的例子中,27日的事件實際上預定在數據庫中持續7天,所以如果我運行MONTH(start_date) = '08'的查詢,我想說前兩個日期被阻止,他們目前不會,因爲阻止它的開始日期不在被選中的月份。

我很確定有一個子查詢或其中的某些內容來抓取行,但我無法想到它。任何接受者?

編輯

下面從薩爾曼回答指出我我想要去的directon,我想出了這個從上月獲得結轉庫存量的方式來顯示爲「1」用的剩餘天數月份的:

SELECT IF(MONTH(start_date) < '08', '2012-08-01', start_date) AS starter, 
     IF(MONTH(start_date) < '08', duration - DATEDIFF('2012-08-01',start_date), duration) AS duration 
FROM EVENTS 
WHERE YEAR(start_date) = '2012' 
AND (MONTH(start_date) = '08' OR MONTH(start_date + INTERVAL duration DAY) = '08') 

顯然有很多的變數存在於PHP來代替,所以也許有一個更好的方法?

+0

更多信息 - 我不想選擇上個月的實際開始日期(因爲該功能只適用於某個日期)。因此,對於7月27日的7天事件,AUGUST的查詢應該返回8月1日的日期,以及2天的時間(對於7天事件發生的8月的2天)。 – Codecraft 2012-07-08 20:49:27

回答

3

原來的答案

假設有問題的月份爲2012-07,你需要這個查詢:

SELECT column1, column2, columnN 
    FROM `events` 
    WHERE `start_date` <= '2012-07-01' 
    AND `start_date` + INTERVAL `duration` DAY > '2012-07-01' 
ORDER BY start_date 

修訂答

顯然,你需要一個查詢檢查重疊(或衝突)的日期。這個例子日期是2012-07-01通過2012-08-01和查詢是:

SELECT * 
    FROM events 
    WHERE '2012-08-01' > start_date 
    AND start_date + INTERVAL duration DAY > '2012-07-01' 
ORDER BY start_date 

要限制的開始日期和時間間隔,您可以使用SELECT ... CASE聲明:

SELECT 
CASE 
    WHEN start_date < '2012-07-01' THEN '2012-07-01' 
    ELSE start_date 
END AS start_date_copy, 
CASE 
    WHEN start_date < '2012-07-01' THEN duration - DATEDIFF('2012-07-01', start_date) 
    ELSE duration 
END AS duration_copy, 
FROM ... 
+0

爲了澄清,事件長度總是要設置 - 如果它的一天事件,它將被設置爲1. – Codecraft 2012-07-08 20:46:23

+0

感謝澄清。在那種情況下,'BETWEEN'查詢會搞砸了。看修改後的答案。 – 2012-07-08 20:49:58

+0

我想讓新月份顯示爲本月的第一天,剩下的日子。你給了我一個解決方案(編輯到問題中),但似乎可能有更好的方法來處理它? – Codecraft 2012-07-08 21:01:26

0

我一直在尋找的答案,感謝其他貢獻者指出我在正確的方向,並使我能夠解決它!

這是基於$ YYYY和$毫米從PHP來(在我的情況下,進入一個函數調用),並選擇單個行,而不是分組:

SELECT start_date, duration 
FROM reservations 
WHERE YEAR(start_date) = '".$yyyy."' 
AND MONTH(start_date) = '".$mm."' 

UNION 

SELECT '".$yyyy."-".$mm."-01', 
duration - DATEDIFF('".$yyyy."-".$mm."-01',start_date) 
FROM reservations 
WHERE YEAR(start_date) = '".$yyyy."' 
AND MONTH(start_date) < '".$mm."' 
AND MONTH(start_date + INTERVAL duration DAY) = '".$mm."' 

ORDER BY start_date