1

PDO php を使用して、現在の週に start_date を持つデータベース テーブルのすべての行を取得しようとしています。今週の最初と最後の日付を計算するには、次を使用します。

$week_start = date('d-m-Y',time()+( 1 - date('w'))*24*3600);  
$week_end =  date('d-m-Y',time()+( 7 - date('w'))*24*3600); 

次に、私のpdoクエリ内に次のものがあります:

$query = " 
    SELECT 
        *
    FROM 
        bookings as bb 
    INNER JOIN 
        reservation as br ON bb.booking_id=br.bookings_id
    INNER JOIN 
        cars as bc ON br.car_id=bc.car_id 
    WHERE 
        payment_success=1 AND 
        is_block=false AND 
        is_deleted=0 AND
        DATE_FORMAT(start_date, '%d-%m-%Y') 
        BETWEEN '".$week_start."' AND '".$week_end."'
"; 

try { 
    $stmt = DB::get()->prepare($query); 
    $stmt->execute(); 

    $rows = $stmt->fetchAll();
}  
catch(PDOException $ex) { 
    die("Failed to run query: " . $ex->getMessage()); 
} 

foreach($rows as $row):
    $row['booking_id'] etc...
endforeach;

問題は、今週中に開始日を持つ複数の予約があるにもかかわらず、出力に行が表示されないことです

4

1 に答える 1

2

DATE_FORMAT()日付ではなく文字列を返します。3つの文字列引数を...に渡しますBETWEEN。誰がそれが何を返すかを知っています。

コードを逆戻りするには、次を使用します。

$week_start = date('Y-m-d',time()+( 1 - date('w'))*24*3600);  
$week_end =  date('Y-m-d',time()+( 7 - date('w'))*24*3600); 

mySQLが期待する方法で日付をフォーマットし、次のようにします。

WHERE 
  start_date BETWEEN '".$week_start."' AND '".$week_end."'

クエリで。

または、オブジェクト指向のアプローチを好む場合は、次のようにします。

$week_start = new DateTime; 
$week_end = new DateTime;
$week_start->setTimestamp(time()+( 1 - date('w'))*24*3600)); 
$week_end->setTimestamp(time()+( 7 - date('w'))*24*3600);

次に、クエリで次のことを行います。

WHERE 
  start_date 
      BETWEEN '".$week_start->format('Y-m-d')."'
      AND '".$week_end->format('Y-m-d')."'

次に、他のすべてについて、希望する形式をエコーできます。

echo $date->format('d-m-Y'); // etc
于 2013-02-26T21:09:50.880 に答える