【问题标题】:Drupal 7 - query using BETWEEN not workingDrupal 7 - 使用 BETWEEN 的查询不起作用
【发布时间】:2011-11-28 20:35:04
【问题描述】:

我在 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语句?谢谢。

【问题讨论】:

  • 我不明白。我尝试了 Clive 和 Krister Andersson 的解决方案,结果与我的代码相同。正在使用的 $start_time 的值是 0600,在数据库中存储为 varchar。作为匹配返回的行具有这些值-> start_time = 0700,end_time = 0950。0600 显然不在 0700 和 0950 之间。无法弄清楚。哼!
  • start_time 和 end_time 应该是数字,而不是字符串
  • @MariusIlie:为什么它们应该是数字?使用 4 个字符的字符串表示时间是完全有效的,它一直都在完成。请记住,这是一个自定义表,不是字段 API 的一部分。
  • 对不起,我的错。你也可以使用字符串。但您还需要GROUP BY 子句

标签: mysql drupal-7 drupal-modules


【解决方案1】:

您可以使用 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】:

    尝试改用>=<=

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

    【讨论】:

      【解决方案3】:

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

      好消息是所有给出的答案都有效。谢谢。

      【讨论】:

        【解决方案4】:

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

        假设您使用以下格式将时间戳保存在数据库中 2014-12-15 09:38:04 要不就 2014-12-15

        现在假设您要搜索与某一天相关的所有行。 如果您使用 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 问题有误。因为它真的很蹩脚。

        问候, 谢里夫。

        【讨论】:

          【解决方案5】:
          $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']) 并更改实际过滤器。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2021-10-05
              • 1970-01-01
              • 2014-10-05
              • 1970-01-01
              • 1970-01-01
              • 2012-02-11
              • 2020-10-25
              • 2013-03-14
              • 2014-01-30
              相关资源
              最近更新 更多