2009-09-22 219 views
0

我的查询有问题。它给了我在某些情况下的正确结果,而对于某些情况,它给了我正确的结果,所以如果有人能告诉我要改变什么,那将是惊人的,因为我现在已经坚持了一段时间。这里是我的表中的数据:MySQL查询日期比较

表reservation_logs:

log_id  int(15) auto_increment Primary Unique 
room_log int(10)   
dt_from  date     
dt_until date    

表公寓:

apartman_id  int(10) auto_increment Primary Unique 
apartman_name int(10) 

我的日期PHP代码:

$date_from = 'text input date'; 
$date_until = 'text input date'; 

$myquery = ("SELECT * FROM reservation_logs WHERE room_log = '$apartman_id' 
AND(((dt_from >= '$date_from' AND dt_from <= '$date_until') 
AND (dt_until >= '$date_until' OR dt_until <= '$date_until')))"); 

现在我输入一些日期我应该得到正确apartman_id,如果它忙或不。以下是这种情况:当$date_from等于当月的第一天,$date_until等于一个月中的最后一天。但是,例如,如果我选择的日期为$date_from等于该月的第16个月,而$date_until等于该月的第17个月,如果从第15个月的第15个月到第19个可以说的空间繁忙,我会得到不正确的结果。我希望我不会让更多的人想到背后的想法太复杂了。

+2

这与您的问题没有直接关系,但是您在此代码中存在一些严重的SQL注入漏洞,您应该清理这些漏洞。确保在mysql_real_escape_string()或某些类似的函数中将所有输入包含到查询中。 – Asaph

+0

这只是练习m8,它永远不会看到我向你保证的网络 – ant

+0

请记住,在内部,日期列包括日期和时间。如果你想选择从15日到16日的所有日期,你需要dt> = 15th和dt <17th(即16日在11:59.59.999 PM或更早) –

回答

1

因此,您希望在$ date_from和$ date_until之间找到预订,即使它们仅覆盖此日期范围?有些事情是如此简单,因为这应该足够了......

SELECT * FROM reservation_logs WHERE room_log = '$apartman_id' 
AND dt_from <= $date_until 
AND dt_until >= $date_from ; 

它根本不包括任何预订这之后日期范围开始,和之前日期范围结束任何预订。任何遗留的事物必须在日期范围内或重叠。

+0

不工作m8,我试过一个1st .. – ant

+0

好吧,这是一个非常标准的习惯用语 - 怀疑它是你的date_until和_date_from变量的格式。 –

+0

确保这些变量是YYYY-MM-DD格式 –

0
dt_until >= '$date_until' OR dt_until <= '$date_until' 

永远是真实的......

+0

有没有这个和下面的帖子之间的链接,当我用2与AND组合时没有任何工作,而使用OR都忙碌.. – ant

0
dt_from >= '$date_from' AND dt_from <= '$date_until' 

...这是唯一真正的,如果$date_from = $date_until