需要存储多个日期范围值并通过sql检索它们

时间:2011-01-27 13:45:56

标签: php sql mysql database-design date

我正在建造一个家庭租赁系统。该系统存储住宅的简档,并且用户可以预订住宅的租金,期限为一天到一年。我已经设置了预订部分,但我面临客户要求能够将某些日期和日期范围设置为无法预订的房屋。

房屋可以租用一整年,或者可以使用6个月,或者在谨慎的日子里无法使用,例如:避暑别墅的假期和周末等。

我很困惑,因为我必须能够设置数据库表来存储此信息,因为这些信息必须可以通过sql查询检索。我的意思是考虑以下情况,除了周三,7月4日,11月10日,12月25日和12月31日之外,可以在全年租用房屋。

如何将其存储在数据库中,并能够运行查询以检查设置日期之间的住宅可用性。我正在使用php MySql

4 个答案:

答案 0 :(得分:2)

您正在描述两种不同的概念:“星期三”并不是一个日期范围,因为它是一种重复模式。 “周末”也是如此。

除了属性表之外,您可能正在查看定义这些不可用日期的两个不同的表:一个表示特定日期范围,另一个表示重复模式。

                         Property
                            |
              -------------- ---------------
             |                              |
PropertyUnavailableRecurrence PropertyUnavailableRange 

(请记住,您可能想要找出更短的名字)

PropertyUnavailableRecurrence需要存储将“星期三”和“周末”变为可行决策逻辑所需的信息。我无法为你模拟这个,因为你们所有人都以这种模式呈现的是一周中的具体日子,但我想你们需要能够说明“本月的第一天”或“本月的第二个星期三“,但我不知道。无论如何,这是您需要存储该信息的地方。

PropertyUnavailableRange只包含定义范围的简单FromTo日期。这部分非常简单。

当然,另一种方法是采用应用程序中指定的重复发生模式并将其转换为谨慎的PropertyUnavailableRange记录,但您仍需要设置一个表来存储这些重复发生并将谨慎关联起来重复记录,以便您可以管理它们。

答案 1 :(得分:1)

一种方法是使用具有以下结构的表PropertyProavailable:

create table PropertyUnavailable
(
  property_id number not null,
  when        date not null
);

由于停电期(例如,每周三,假日等),该表每天都会有一行该房产不可用。我忽略了你将如何存储模式的元信息 - 所有这些表都想要的是因为停电期间属性不可用的每一天的行。

我假设您还将有一个预订日期表,PropertyReserved,具有与上述相同的结构以及reservation_id的外键(或类似的东西)。

现在看看在给定的日期范围内哪一天不可用/保留,sql会是这样的:

SELECT a.when, 'blackout'
FROM PropertyUnavailable a
WHERE a.when between <from_date> to <to_date>
UNION ALL (
SELECT b.when, 'reserved'
FROM PropertyReserved b
WHERE b.when between <from_date> to <to_date>
);

如果查询没有返回任何内容,则该属性在指定的日期范围(from_date,to_date)之间可用。

答案 2 :(得分:0)

您是否考虑过以系统名义预订那些“不可预订”的日期?

答案 3 :(得分:0)

您似乎不清楚需要存储在数据库中的内容;以及代码段中需要什么。暂时设置“不可预订”日期,假设您只有实际预订日期。 Catcall有一点意见。当您搜索可用日期时,您当前的代码是什么样的?

SQL非常能够处理日期和执行日期算术。我的NonSQL不是,你必须在数据库中存储比在真正的SQL中存储更多。但是您不需要每个日期存储行。 Reservation表只需要FromDate和ToDate。