2012-03-28 15 views
0

私は、ユーザーがホテルの予約の開始日と終了日を提示するシナリオを持っています。データベースには、年間の価格が毎日異なります。ユーザーの日付範囲を前提として、データベースの各範囲でユーザーの範囲にある日数を数え、その日の日の価格でそれを掛けることから始めたいと考えています。PHPの日付と日のカウント

ユーザーズ日付:あなたは予約が最初の範囲で始まる見ることができるようにDB

Array 
(
    [0] => stdClass Object 
     (
      [date_from] => 2012-04-09 
      [date_to] => 2012-06-04 
      [price] => 44 
     ) 

    [1] => stdClass Object 
     (
      [date_from] => 2012-06-04 
      [date_to] => 2012-07-02 
      [price] => 52 
     ) 

    [2] => stdClass Object 
     (
      [date_from] => 2012-07-02 
      [date_to] => 2012-07-16 
      [price] => 61 
     ) 

) 

から

03 Jun 2012 - 03 Jul 2012 

関連する日付の範囲は、第二の範囲にまたがり、第3の範囲で終わります。

foreach ($dates as $key => $d) 
{ 
    $days = 0; 

    $user_start = strtotime($range['start']); 
    $user_stop = strtotime($range['stop']); 
    $db_start = strtotime($d->date_from); 
    $db_stop = strtotime($d->date_to); 

    if($user_start >= $db_start && $user_stop < $db_stop) 
    { 
     $start = $range['start']; 
     $stop = $range['stop']; 
    } 

    elseif($user_start <= $db_start && $user_stop > $db_start) 
    { 
     $start = $d->date_from; 
     $stop = $d->date_to; 
    }  

    elseif($user_start <= $db_stop && $user_stop > $db_stop) 
    { 
     $start = $range['start']; 
     $stop = $d->date_to; 
    } 

    $days = calculate_nbr_days($start, $stop); 

    $price += $days * $d->price; 
} 

このコードはほとんどではなく、ユーザーの範囲のDB範囲の最後の日であるとして予約($stop)の終わりを取り、私はその理由を把握することはできません事実を除いて、動作します!

+0

あなたはDB範囲の終わりまで計算するように '$ dates'をループします – safarov

答えて

2

あなたはSQLでそれをやってみたことがありますか?これはうまくいくはずです:

SELECT 
    SUM(
    datediff(
     IF($dateTo>date_to,date_to,$dateTo), 
     IF($dateFrom<date_from,date_from,$dateFrom) 
    ) * price_per_day 
) as total_cost 
FROM ranges 
WHERE '$dateFrom'<=date_to 
    AND '$dateTo'>=date_from 
関連する問題