我在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语句?感谢。
答案 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
子句