Drupal 7 - 使用BETWEEN查询无效

时间:2011-11-28 20:35:05

标签: mysql drupal-7 drupal-modules

我在Drupal 7中有一个搜索自定义表的查询:

$query5 = "SELECT COUNT(reservation_id) as rcount5, reservation_id FROM {reservations} WHERE resource_id = :resource_id AND reservation_date = :reservation_date AND start_time BETWEEN :start_time AND :end_time";
$result5 = db_query($query5, array(':resource_id' => $resource_id, ':reservation_date' => $reservation_date, ':start_time' => $start_time, ':end_time' => $end_time));

查询无效,因为我认为它没有正确识别BETWEEN函数并返回end_time,因为它存在。有没有办法显示drupal或db api这是BETWEEN语句?感谢。

6 个答案:

答案 0 :(得分:8)

您可以使用Drupal 7数据库API并添加BETWEEN这样的参数:

$query5 = db_select('reservations', 'r')
  ->fields('r', array('reservation_id'))
  ->condition('resource_id', $resource_id)
  ->condition('reservation_date', array($start_time, $end_time), 'BETWEEN');

$query5->addExpression('COUNT(reservation_id)', 'rcount5');
$result5 = $query->execute();

在我看来,阅读起来容易得多:)

请查看Dynamic queries了解更多信息和示例。

答案 1 :(得分:1)

尝试改为使用>=<=

   $query5 = "SELECT COUNT(reservation_id) as rcount5, reservation_id 
              FROM {reservations} 
              WHERE resource_id = :resource_id AND 
              reservation_date = :reservation_date AND 
              (start_time >= :start_time AND start_time <= :end_time)";

答案 2 :(得分:1)

好的,想出了答案。首先,我的原始代码工作正常。我不得不在数据库中将数据类型更改为int,之后它工作正常。感谢。

好消息是所有答案都有效。感谢。

答案 3 :(得分:0)

我完全确定这是默认情况还是db_query / db_select中的错误。

假设您使用以下格式在DB中保存时间戳 2014-12-15 09:38:04 要不就 二〇一四年十二月一十五日

现在假设您要搜索与一天相关的所有行。 如果您使用BETWEEN抛出原始MySQL查询,它将完美地工作。 例如:

select * from table 
where timestamp between "2014-12-15" and "214-12-15";

但是,如果使用db_query或db_select创建查询,则以下语句将不起作用: 例如:

$query->condition('timestamp', array("2014-12-15", "2014-12-15"), 'BETWEEN');

出于某种原因,Drupal似乎比较2014-12-15 0:0:0到2014-12-15 0:0:0。

如果您使用以下格式创建条件,它将起作用

$query->condition(
 'timestamp', 
  array("2014-12-15", "2014-12-15" . ' 23:59:59'), 
 'BETWEEN'
);

使用真实过滤器,语句为:

$query->condition(
  'timestamp', 
  array($stardate, $endate . ' 23:59:59'), 
  'BETWEEN'
);

我希望我对这个Drupal问题错了。因为它真的很蹩脚。

此致 谢里夫。

答案 4 :(得分:0)

$query->condition('timestamp', array("2014-12-15", "2014-12-15"), 'BETWEEN')

并不适用于drupal,因为它没有真正的过滤器。 @Sharif El Shobkshy给出的解决方案是可行的解决方案。

$query->condition(
  'timestamp', 
  array($stardate, $endate . ' 23:59:59'), 
  'BETWEEN'
);

请注意$ stardate和endate必须采用php date(Y-m-l)格式。但是如果日期存储为整数,则将其更改为date(Yml,$_Post['date'])并更改实际过滤器。

答案 5 :(得分:-2)

如果您在查询中使用COUNT()和其他字段选择,则还应使用GROUP BY子句