我有'费率'表
id | roomTypeId | periodFrom | periodTo | price
1 | 49 | 2010-8-1 | 2010-8-13 | 120
2 | 49 | 2010-8-14 | 2010-8-15 | 170
3 | 49 | 2010-8-16 | 2010-8-31 | 120
...
...
数据:
我的查询
$query = null;
$query .=" roomTypeId=".$obj->roomTypeId;
$query .=" AND periodFrom>='".$obj->checkInDate."'";
$query .=" AND periodTo<='".$obj->checkOutDate."'";
$stmt = $this->db->query ( 'SELECT * FROM rates WHERE '.$query);
...
...
并仅返回
2 | 49 | 2010-8-14 | 2010-8-15 | 170
我想要那个时期的所有费率条目。
答案 0 :(得分:3)
您只有一行符合这两个条件(PeriodFrom&gt; = 2010-8-10 AND PeriodTo&lt; = 2010-08-20)。该行是第2行,也就是返回的那一行。显然,你的查询是错误的。
1 | 49 | 2010-8-1 | 2010-8-13 | 120
第1行不匹配,因为即使PeriodTo小于或等于2010-8-20,PeriodFrom也小于2010-8-10。 PeriodFrom取消您的条件。
3 | 49 | 2010-8-16 | 2010-8-31 | 120
第3行不匹配,因为虽然PeriodFrom大于或等于2010-8-10,但PeriodTo不小于或等于2010-8-20。期限取消您的条件。
由于你还没有真正弄明白你在寻找什么,我不确定答案是什么。您已经询问了PeriodFrom&gt; = SomeDate和PeriodTo&lt; = AnotherDate的行,但似乎想要一些不同的东西。
您似乎正在寻找的PeriodRerom大于某个日期,或者PeriodTo小于其他日期的房间。如果是这种情况,请将您的AND更改为OR:
SELECT * FROM RATES WHERE PeriodFrom >= '2010-8-10' OR PeriodFrom <= '2010-8-20'.
我怀疑这不是你想要的。
您希望查询返回什么内容?尝试用简单的术语陈述问题(没有SQL)。 “我正在寻找[某些标准]的房间”。描述你用某些标准取代的东西,也许有人可以提供帮助。
答案 1 :(得分:0)
看起来你正在寻找任何记录,其中periodFrom和periodTo属于checkInDate和checkOutDate,但你的确错误。
select * from RATES
where periodFrom between date(checkInDate) and date(checkOutDate)
and periodTo between date(checkInDate) and date(checkOutDate);
这个想法是你想要任何包含periodFrom的记录 - &gt;期间到范围。
你也可以在没有'between'语法的情况下写这个(只为每个之间做&gt; =和&lt; =),但这似乎更清楚,并保证正确的日期比较。
答案 2 :(得分:0)
我怀疑您可能需要做的是获取所定义日期范围内的所有费率信息,获取结果数据,然后在您选择的脚本语言中处理这些数据,以确定需要哪些日期收费率等等。
:你所追求的问题是:
SELECT * FROM rates WHERE
(checkInDate >= periodFrom AND checkInDate <= periodTo)
OR
(checkOutDate >= periodFrom AND checkOutDate <= periodTo)