2011-11-28 52 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'])並更改實際濾波器。