php mysql比较日期并与用户输入日期匹配

php mysql比较日期并与用户输入日期匹配,php,mysql,date,Php,Mysql,Date,我正在做一个房屋租赁预订页面 如果我的用户提交UNIX日期时间:到达和离开日期,我有一个日期选择器。 在mySQL上,我有一栋不同季节的房子,有“季节开始”日期(YYYY-mm-dd)、“季节结束”日期和“每天价格” $seasons\u select=“选择id、季节开始、季节结束、每日价格来源”.T\u项目季节。“其中id\u项目=“.id\u项目.”按季节开始订购”; $res_seasures=mysql_query($seasures_select)或die(“获取状态的错误”); $

我正在做一个房屋租赁预订页面

如果我的用户提交UNIX日期时间:到达和离开日期,我有一个日期选择器。
在mySQL上,我有一栋不同季节的房子,有“季节开始”日期(YYYY-mm-dd)、“季节结束”日期和“每天价格”

$seasons\u select=“选择id、季节开始、季节结束、每日价格来源”.T\u项目季节。“其中id\u项目=“.id\u项目.”按季节开始订购”;
$res_seasures=mysql_query($seasures_select)或die(“获取状态的错误”);
$arrival\u date=日期('d-m-Y',$arrival\u date);
$出发日期=日期('d-m-Y',$出发日期);
而($seasures\u row=mysql\u fetch\u assoc($res\u seasures)){
$start_date=日期('d-m-Y',STROTIME($SECTURES_row[“SECTURES_start”]);
$end_date=date('d-m-Y',strottime($seasures_row[“seasures_end”]));
$current\u date=$start\u date;
while($current_date!=$end_date){
$current_date=日期(“d-m-Y”,标准时间(“+1天”,标准时间($current_date));
$match_date=$arrival_date;
while($match_date!=$offering_date){
$match_date=日期(“d-m-Y”,标准时间(“+1天”,标准时间($match_date));
如果($current_date==$match_date){
echo$current_date.“这是其中一天!
”; } } } }
如果用户到达/离开期间内的日期在一个或几个季节内,那么最好的匹配方式是什么

我的代码工作正常…
我得到了我想要的答案,但之后出现了“致命错误:超过了30秒的最长执行时间”

如果一个日期在用户到达/离开期间内,那么最好的匹配方法是什么

嗯,你的看起来有点糟糕:-)

我会说,让MySQL来做这项工作——首先只选择那些你想要的记录

要检查单个日期是否在“季节”内,必须检查它是否大于等于季节开始日期,小于等于季节结束日期

要了解到达/离开期间的任何一天所处的所有季节,您必须检查四种情况:

|
是季节的开始和结束,
A
是选择的到达日期,
D
是选择的出发日期。)

  • 季节完全进入选定的时期

  • 季节开始前到达,季节结束前离开

  • 季节开始后到达,季节结束前离开

  • 季节开始后到达,季节结束后离开

  • (Before和after总是指包含,所以实际上是Before/on和on/after。)


    放入一个查询中,它可能看起来像这样,
    2013-05-04
    作为到达日期,
    2013-07-04
    作为出发日期:

    SELECT id, season_start, season_end, daily_price FROM table
    WHERE id_item = 1234 AND (
       ('2013-05-04' <= season_start AND '2013-07-04' >= season_end) OR
       ('2013-05-04' <= season_start AND '2013-07-04' <= season_end) OR
       ('2013-05-04' >= season_start AND '2013-07-04' <= season_end) OR
       ('2013-05-04' >= season_start AND '2013-07-04' >= season_end)
    )
    ORDER BY season_start
    

    与其在一个季节的所有日子里循环查看给定日期是否在其范围内,不如尝试以下查询

    "SELECT id,season_start,season_end,daily_price FROM ".T_ITEM_SEASONS." WHERE id_item=".ID_ITEM." AND season_start <= $arrival_date AND season_end >= $departure_date ORDER BY season_start ";
    
    “从“.T\u ITEM\u seasures.”中选择id、季节开始、季节结束、每日价格,其中id\u ITEM=“.id\u ITEM.”和季节开始=$按季节开始的出发日期订单”;
    
    其中,$arrival\u date和$example\u date是来自日期选择器的值

    这样你就不必在一个季节的所有日子里循环寻找匹配的日期


    请注意,在到达和离开日期跨越季节(到达一个季节并离开另一个季节)的情况下,预期的结果将只返回到达和离开日期在同一季节内的行。p> @SalmanA,这个问题不像你说的那么简单。虽然我从中学到了一些东西(谢谢你的指点),但在我的例子中,我有1个日期范围,我必须用x个不同的日期交叉。例如,一个到达和离开日期可以跨越淡季、中季和/或旺季。。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO,。实际上,这可以通过两个
    检查来完成。您应该通过此查询(也使用简化版本)获得所有季节,因为到达或出发日期都在其中,或者被到达和出发“包围”,这不是您想要的吗?是的,我想要所有与该日期相关的季节,但我不知道
    将如何做到这一点。是8
    参数还是4?多个<代码>和<代码>是否配对在一起,因此第一个是优先配对,依此类推?我不需要
    ?我正在努力使它在我的网站现在的工作。(事实上,我很高兴有人提供了很好的意见,谢谢!)啊……是的,当然,或者说,对不起。编辑了我的答案。是的!非常感谢。我现在注意到在第一个
    之后有额外的
    ()
    。很好的输入!不够完整。不包括所有情况。例如,当到达时间在赛季开始之前,而离开时间在赛季开始和结束之间。因此,我在结尾处发表了评论。最初的请求没有明确说明在跨越季节的日期的情况下,期望的行为是什么。而不是假设这样的情况应该包括在内,我选择要求用户考虑什么是正确的行为应该是。OP应使用这些信息更新问题,以帮助澄清。感谢Istari提出您的想法。正如@SalmanA评论的那样,我不知道该怎么做,当到达和离开不在同一个季节。
    SELECT id, season_start, season_end, daily_price FROM table
    WHERE id_item = 1234 AND (
       ('2013-05-04' <= season_start AND '2013-07-04' >= season_end) OR
       ('2013-05-04' <= season_start AND '2013-07-04' <= season_end) OR
       ('2013-05-04' >= season_start AND '2013-07-04' <= season_end) OR
       ('2013-05-04' >= season_start AND '2013-07-04' >= season_end)
    )
    ORDER BY season_start
    
    WHERE id_item = 1234 AND
      ('2013-05-04' <= season_end) and ('2013-07-04' >= season_start)
    
    "SELECT id,season_start,season_end,daily_price FROM ".T_ITEM_SEASONS." WHERE id_item=".ID_ITEM." AND season_start <= $arrival_date AND season_end >= $departure_date ORDER BY season_start ";