我正在编写脚本,该脚本要求管理员能够插入他想要可用停车场的日期,管理员在范围内插入日期。
我很难找到在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 的最后一行。
[编辑完]
提前谢谢你。
关于查询的 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。
为什么要复杂化这么多?
SELECT *
FROM `parking_lot_dates`
WHERE available_from_date <= '2012-04-22'
AND available_until_date >= '2012-04-30';
我个人发现最好有 2 列,开始和结束时间,用于搜索特定日期,或者只是查看它对我来说似乎更容易
从数据库的角度来看,使用 1 列来存储这些日期是一个糟糕的设计(未规范化)。最好有 2 列,因为可以更轻松地检索结果,并且从单个列中提取信息意味着必须进行某种拆分。它只是不优雅,当需求发生变化时表现不佳。