2011-11-28 54 views
4

我在Drupal 7的一个查询正在搜索的自定义表查询:Drupal的7 - 使用BETWEEN不工作

$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因为它存在。有没有办法显示这是一个BETWEEN语句的Drupal或数据库API?谢谢。

+0

我不明白。我尝试了Clive和Krister Andersson的解决方案,结果与我的代码相同。正在使用的$ start_time的值是0600,作为varchar存储在数据库中。作为匹配返回的行具有这些值 - > start_time = 0700,end_time = 0950. 0600显然不是BETWEEN 0700和0950.无法弄清楚。哼! – RayJamesFun

+0

start_time和end_time应该是数字,而不是字符串 –

+0

@MariusIlie:他们为什么应该是数字?使用4个字符的字符串表示一个时间是完全有效的,它总是完成。请记住,这是一个自定义表格,不属于字段API。 – Clive

回答

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

您可以使用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了解更多信息和示例。

-2

如果您在查询中使用COUNT()和其他领域的选择,你也应该使用GROUP BY条款

1

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

好消息是,所有的答案给出了工作。谢谢。

0

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

假设您保存时间戳DB格式如下 情节中字9时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问题。因为这真的很蹩脚。

Regards, Sharif。

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'])并更改实际滤波器。