高级MYSQL日期查询

时间:2009-11-12 19:17:13

标签: mysql

我有'费率'表

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  
...  
...  

数据:

  • checkInDate = 2010-8-10
  • checkOutDate = 2010-8-20

我的查询

$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  

我想要那个时期的所有费率条目。

3 个答案:

答案 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)