2012-04-21 102 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