2012-03-28 5 views
0

Ich habe ein Szenario, wo ein Benutzer ein Start-und Stop-Datum für eine Reservierung in einem Hotel übermittelt. Die Datenbank hat unterschiedliche (tägliche) Preise für Zeiträume des Jahres. Angesichts des Datumsbereichs des Benutzers möchte ich beginnen, indem ich die Anzahl der Tage, die der Bereich des Benutzers in jedem Bereich hat, aus der Datenbank zähle und dann mit dem Tagespreis für diesen Zeitraum multipliziere.PHP-Daten und Tageszählung

frei Benutzer:

03 Jun 2012 - 03 Jul 2012 

Relevante Datumsbereiche von der 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 
     ) 

) 

Wie Sie die Reservierung beginnt im ersten Bereich sehen können, erstreckt sich über den zweiten Bereich und endet in der dritten Reihe.

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; 
} 

Dieser Code fast funktioniert, außer der Tatsache, nimmt er das Ende der Reservierung ($stop) als das letzte Datum des DB-Bereich statt der Reichweite des Benutzers sein, und ich kann, warum nicht herausfinden!

+0

Sie Schleifen '$ Daten', so wird es bis zum Ende der DB-Bereich berechnen – safarov

Antwort

2

Haben Sie darüber nachgedacht, alles in SQL zu tun? Etwas, das sollte funktionieren:

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 
Verwandte Themen