我正在编写脚本,要求管理员能够在他想要停车场时插入日期,管理员在一个范围内插入日期。
我很难找到在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
以及我想要存储的所有可用日期等 [编辑结束]
基本上,管理员希望插入停车场可用的日期范围,并允许成员在用户正在寻找该范围内的插槽时选择该插槽。
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 的最后一行 [编辑结束]
提前谢谢。
答案 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列,因为可以更容易地检索结果,从单个列中提取信息意味着必须进行某种分割。它只是不优雅,当需求发生变化时表现不佳。