如何使用PDO查询将BETWEEN与TIMESTAMPDIFF结合使用?

时间:2012-07-25 18:47:00

标签: php sql pdo

我正在尝试修改从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

不幸的是,我找不到解决方案。

以下是我的代码,现在,任何帮助表示赞赏。 (我使用3个变量,selectedcitytype

// 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);

2 个答案:

答案 0 :(得分:1)

您需要在接下来的两个小时内开始参加活动。或 例如

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

答案 1 :(得分: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

并且有一个有效的example