2011-11-28 2 views
4

작동하지 BETWEEN 사용하여 쿼리드루팔 7 - 나는 사용자 정의 테이블을 검색하는 드루팔 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)); 

내가 제대로 기능 사이의 인식되지 않는다는 것을 믿기 때문에 쿼리가 작동하지 않는 및 end_time이 있으므로이를 반환합니다. 이것이 BETWEEN 문인 drupal 또는 db api를 표시하는 방법이 있습니까? 감사.

+0

나는 그것을 얻지 않는다. 나는 Clive와 Krister Andersson의 솔루션을 내 코드와 동일한 결과로 시도했다. 사용되는 $ start_time의 값은 데이터베이스에서 varchar로 저장된 0600입니다. 일치 항목으로 반환되는 행의 값은 -> start_time = 0700, end_time = 0950입니다. 0600은 분명히 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

당신은 드루팔 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을보십시오. 당신이 당신의 쿼리에서 COUNT() 다른 필드 선택을 사용하는 경우

-2

, 당신은 또한

1

가 좋아, 대답 함께했다 GROUP BY 절을 사용해야합니다. 첫째, 내 원래 코드가 잘 작동합니다. 데이터 유형을 데이터베이스의 int로 변경해야하고 그 이후에는 정상적으로 작동합니다. 감사.

좋은 소식은 모든 답변이 효과가 있다는 것입니다. 감사.

0

기본적으로 db_query/db_select의 버그인지 여부는 확실합니다.

의 당신은 다음과 같은 형식으로 DB에 타임 스탬프를 저장하는 것이 가정하자 2014년 12월 15일 9시 38분 4초 하거나 2014년 12월 15일

이제 모든 행을 검색 할 가정 할 수 있습니다 하루에 관련이 있습니다. BETWEEN을 사용하여 원시 MySQL 쿼리를 던지면 완벽하게 작동합니다. 예 : 당신이 db_query 또는 db_select를 사용하여 쿼리를 작성하는 경우

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

그러나, 아래의 문이 작동하지 않습니다 예 :

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

을 어떤 이유로, 드루팔은 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) 문제. 왜냐하면 그것은 정말로 절름발이이기 때문입니다.

감사합니다. 샤리프.

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

노트는 $ 우주력과 endate는 PHP date(Y-m-l) 형식이어야합니다. 그러나 날짜가 정수로 저장되면 date(Yml,$_Post['date'])으로 변경하고 실제 필터도 변경하십시오.