0

特定の日付と時刻の間の行を DB から返す既存のコードを変更しようとしています。それは正しく機能しますが、以下に説明する機能を追加したいと思います。

これは私のDBの例です

           start                  end
1st row    2012-07-24 18:00:00    2012-07-28 17:00:00
2nd row    2012-07-25 19:00:00    2012-07-30 19:00:00
3rd row    2012-07-25 22:00:00    2012-07-28 13:00:00
4th row    2012-07-25 23:40:00    2012-07-27 18:00:00
...
...
...

入力が2012-07-25 23:00:00の場合 BETWEEN start AND end ORDER by start DESC

結果は、

3rd row
2nd row
1st row

ここまではすべてが素晴らしいです。ただし、次の 2 時間以内 に開始される行をリストの一番上に表示したいと考えています。これは行番号 4 です。

使ってみました

 ABS(TIMESTAMPDIFF( HOUR , `start`, :time )) < 2

残念ながら、私は解決策を見つけることができません。

以下は私のコードです。selected( 、 、cityおよびの 3 つの変数を使用しますtype)

// Store where clauses and values in arrays
$values = $where = array();

if (!empty($selected)) { // 
    $where[] = ':selected BETWEEN `start` AND `end`';
    $values[':selected'] = $selected;
}

if (!empty($city)) { // 
    $where[] = '`city` = :city';
    $values[':city'] = $city;
}

if (!empty($type)) { // 
$where[] = '`type` = :type';
$values[':type'] = $type;
}

// Build query
$question = 'SELECT * FROM `events`';
if (!empty($where)) {
    $question .= ' WHERE '.implode(' AND ', $where);
    $question .= ' ORDER BY `start` DESC';
}

$query = $db->prepare($question);

$query->execute($values);
4

2 に答える 2

1

引数の順序を確認しなかったため、条件が逆になりました。しかし、私の最初の声明はまだ有効です。基本的に、最も簡単な答えは、次のように開始時間を調整することです。

SELECT * 
FROM TMP
WHERE startedAt < DATE_ADD(TIMESTAMP('2012-07-25 23:00:00'), INTERVAL 2 HOUR)
AND endedBy >= TIMESTAMP('2012-07-25 23:00:00')
ORDER BY startedAt DESC

そして、実用的な例があります。

于 2012-07-25T20:10:37.997 に答える
1

次の 2 時間で開始するイベントの OR が必要です。
例えば

where type = :type and city = :city and
((:selected BETWEEN `start` AND `end`) or 
 (`start` between :selected and adddate(:selected, interval 2 hours))
)
order by `start` desc
于 2012-07-25T19:00:37.393 に答える