5

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

我很难找到在 MySQL 中存储日期的最佳方法的解决方案。

AVAILABLE_FROM_DATE我应该使用两列存储日期AVAILABLE_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

对于我要存储的所有可用日期,依此类推。
[编辑结束]

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

或者有没有更好更简单的方法来做到这一点?

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

[编辑开始]

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

4 回答 4

6

关于您的 EDIT 查询,您的逻辑由内而外。您需要比较您检查的每个日期是否在范围内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。

于 2012-04-21T18:56:12.280 回答
3

为什么要这么复杂?

SELECT *
FROM `parking_lot_dates`
WHERE available_from_date <= '2012-04-22'
AND available_until_date >= '2012-04-30';
于 2012-04-21T19:03:18.087 回答
0

我个人发现最好有 2 列,即开始时间和结束时间,用于搜索特定日期,或者只是查看它对我来说似乎更容易

于 2012-04-21T18:48:34.423 回答
0

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

于 2012-04-21T18:59:41.173 回答