在MySQL解决方案中存储日期范围

时间:2012-04-21 18:40:51

标签: php mysql database

我正在编写脚本,要求管理员能够在他想要停车场时插入日期,管理员在一个范围内插入日期。

我很难找到在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并将管理员选择的范围存储在范围之间的每个日期的新行中?

[编辑开始]
我在上面使用单个列的意思是不将日期连接或拆分成单个列,我实际上是指将日期存储在单行中,如下所示:

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

以及我想要存储的所有可用日期等 [编辑结束]

基本上,管理员希望插入停车场可用的日期范围,并允许成员在用户正在寻找该范围内的插槽时选择该插槽。

OR有更好更简单的方法吗?

我目前正在尝试使用第一种方法,使用单独的列作为范围,但在查找范围内的停车场时无法获得所需的结果。

[编辑开始]

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'))

我对上面的行使用以下查询,它返回空。 我希望它返回PLID 2 的最后一行 [编辑结束]

提前谢谢。

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:3)

为什么这么复杂?

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

答案 2 :(得分:0)

我个人觉得最好有两列,一个开始和结束时间,用于搜索特定日期,或者只是看着它似乎对我来说更容易

答案 3 :(得分:0)

从数据库的角度来看,使用1列存储这些日期是一个糟糕的设计(未规范化)。最好有2列,因为可以更容易地检索结果,从单个列中提取信息意味着必须进行某种分割。它只是不优雅,当需求发生变化时表现不佳。