2012-04-21 99 views
4

我對劇本這需要給管理員插入日期時,他想提供一個停車場的能力工作用存儲日期範圍,管理員插入日期範圍。在MySQL解決方案

我有一個艱難的時間來解決這將是存儲在MySQL中日期的最佳途徑。

我應該使用存儲兩列AVAILABLE_FROM_DATEAVAILABLE_UNTIL_DATE的日期?

PLID AVAILABLE_FROM DATE   AVAILABLE_UNTIL_DATE 
1  2012-04-01     2012-04-03 
1  2012-04-05     2012-04-15 
2  2012-04-21     2012-04-30 

或者我應該只使用一列AVAILABLE_DATE和存儲管理員在一個新行選擇範圍的範圍之間的每個日期?

[EDIT START]
上面我的意思是通過使用單一的列不加入或日期分成單個列,我實際上意味着存儲在單行中的日期中包含的單個列:

PLID AVAILABLE_DATE 
1  2012-04-01 
1  2012-04-02 
1  2012-04-03 

等等我想要存儲的所有可用日期。
[編輯結束]

基本上,管理員將要插入日期範圍內的停車場可用,並允許成員選擇該插槽,如果用戶正在尋找該範圍內的插槽。

或者有沒有更好更簡單的方法來做到這一點?

我目前正在使用使用單獨列的範圍第一種方法,但有麻煩找一個範圍內的停車場時取得了預期的效果。

[EDIT START]

SELECT * FROM `parking_lot_dates` 
WHERE (available_from_date BETWEEN '2012-04-22' AND '2012-04-30' 
AND (available_until_date BETWEEN '2012-04-22' AND '2012-04-30')) 

我使用上述i行有以下查詢,並返回空。 我希望它返回PLID爲的最後一行。
[編輯結束]

預先感謝您。

+0

只是想後,我沒有接受任何解答的原因是,我的問題只被解決了一半,我的主要問題仍然沒有得到回答。主要問題是我應該用哪種方式來存儲日期。 '我應該將每個日期存儲在單獨的行中還是存儲帶有範圍的2列行?或者如果有一種更簡單的方法,那麼我剛剛說的那些?' – Zubair1 2012-04-22 14:08:56

回答

5

關於與查詢你的編輯,你有外面的邏輯。你需要比較每個要檢查日期是否在範圍內BETWEEN available_from_date and available_until_date,就像這樣:

SELECT * FROM `parking_lot_dates` 
WHERE 
(
     '2012-04-22' BETWEEN available_from_date AND available_until_date 
    AND '2012-04-30' BETWEEN available_from_date AND available_until_date 
) 

演示:http://www.sqlfiddle.com/#!2/911a3/2

編輯:但如果你將需要允許局部範圍內的比賽,你需要兩種類型的邏輯,即停車場是4-22到4-27,你需要它4-23到4-28。您可以在4-23到4-27的日期使用它,但不能使用4-28。

+0

感謝您的修復,我是一種強調atm。我討厭處理日期和時間,不只是在MYSQL :)雖然更新的版本,你肯定會給我期望的結果,我一直在尋找:) – Zubair1 2012-04-21 19:07:27

+0

我真的想要+1發佈鏈接到該sqlfiddle網站,這很棒。但不幸的是,我不能這樣做:(如此感謝:) – Zubair1 2012-04-21 19:08:41

+0

我正在閱讀你的編輯,並且對你的意思感到迷惑不解。你的意思是上述邏輯將工作,如果我有一個範圍4-22到4-27的行,它會工作,如果我嘗試獲得該範圍,但不工作,如果我想要4-23到4-28?如果多數民衆贊成的情況下,我實際上希望它的行爲就像我的意思是我只希望它找到一個4-23至4-28範圍,如果該表範圍內的行可用。 – Zubair1 2012-04-22 01:51:02

0

我個人發現它最好有2列,開始和結束時間,要搜索的特定日期,或只是看着它似乎更容易我

+0

是的,我也是。我在這裏決定一個艱難的時間,因爲它看起來兩列方法會使事情複雜化在這種情況下。 – Zubair1 2012-04-21 19:21:34

0

使用1列來存儲這些日期是從視圖(不歸一化)的數據庫點一個不好的設計。最好有2列,因爲可以更容易地檢索結果,從單個列中提取信息意味着必須進行某種分割。這只是不夠優雅,而且在需求變化時表現不佳。

+0

你能不能詳細說明一下?爲什麼我想從單列方法中分離出來?我腦子裏想的是,如果所需的範圍可用,我只是循環遍歷行來匹配? – Zubair1 2012-04-21 19:24:29

+0

@ Zubair1那麼,只有當你以某種方式將它們作爲字符串存儲在某個列的分隔符中時,纔可以完成在一列中存儲起始日期和結束日期(這是你問的是否應該這樣做)。例如:'2012-04-03; 2012-04-09'。在這種情況下,';'是分隔符,當你從表中得到這個序列時,你將不得不將它分成2個。就像我說的那樣:這是一個糟糕的設計。它會工作,但這是一個不好的做法。 – 2012-04-21 20:00:10

+0

哦對不起,我似乎在上面混淆了一下。但我不打算像你提到的那樣存儲價值。我打算每個都保存一個日期。例如:**第1行**'AVAILABLE_DATE ='2012-04-03''然後**第2行**'AVAILABLE_DATE ='2012-04-04''和**第3行**'AVAILABLE_DATE ='2012 -04-05''等。但我同意你所說的是一個糟糕的設計,並沒有規範化,我當然從來沒有這樣做過。如果我使用這種方法(爲每個日期存儲一個新行,我很快就會在表中包含很多行,那是什麼讓我困擾着這種方法)。 – Zubair1 2012-04-21 20:14:57

3

爲什麼這麼複雜?

SELECT * 
FROM `parking_lot_dates` 
WHERE available_from_date <= '2012-04-22' 
AND available_until_date >= '2012-04-30'; 
+0

我真的很希望它那麼簡單,但那是行不通的。 – Zubair1 2012-04-21 19:05:25

+1

@ Zubair1條件哪裏錯了我修正了,爲什麼這不起作用? – sbczk 2012-04-21 19:06:39

+0

我沒有看到任何改變,但我仍然嘗試了它,並沒有給我任何結果。可能是因爲這是檢查如果available_from_date等於或大於'2012-04-22',那日期不是我發佈在我的問題中的記錄列表中的有效行。 – Zubair1 2012-04-21 19:12:08