CakePHP在2个日期记录之间搜索

时间:2012-08-10 09:51:21

标签: cakephp search date between

我正在构建一个小型Web应用程序,让用户可以预订办公室房间和设备。对于预订,他们输入开始和结束日期。

当用户试图找出2012-10-23中是否有任何(例如)汽车可用时,并且数据库保留了开始的预订日期记录:2012-10-20和结束:2012-10-25 (比方说说)所有的汽车,如何在搜索中包含我的日期条目之间的所有日期?

$date变量从日期搜索表单字段中获取它的值。

遗憾的是,这不起作用,我无法弄清楚如何将daysAsSql用于此查询:

$conditions = array(
    'conditions' => array(
        '? BETWEEN ? AND ?' => array($date,'Equipment.date_start','Equipment.date_end'), 
    )));

$this->set('equipments', $this->Equipment->find('all', $conditions));

6 个答案:

答案 0 :(得分:9)

有一个更简单的解决方案,但感谢您的帮助:

(作为发现中的条件:)

array('Equipment.date_start <= ' => $date,
      'Equipment.date_end >= ' => $date
     ),

答案 1 :(得分:3)

以下是CakePHP BETWEEN查询示例。

我将我的数组定义为变量,然后在我的CakePHP查找函数调用中使用这些变量:

// just return these two fields
$fields = array('uri', 'page_views');

// use this "between" range
$conditions = array('Event.date BETWEEN ? and ?' => array($start_date, $end_date));

// run the "select between" query
$results = $this->Event->find('all', 
         array('fields'=>$fields, 
               'conditions'=>$conditions));

Ref from

答案 2 :(得分:2)

$start = date('Y-m-d');
$end = date('Y-m-d', strtotime('+1 month'));

$conditions = array('Event.start <=' => $end, 'Event.end >=' => $start);

$this->Event->find('all', array('conditions' => $conditions));

答案 3 :(得分:2)

如果您有一个日期并且想要使用BETWEEN

$date_start = start date;
$date_end = date_end;

$conditions = array(
    'conditions' => array(
        'date(Equipment.create) BETWEEN ? AND ?' => array($date_start, $date_end), 
    )));

$this->set('equipments', $this->Equipment->find('all', $conditions));

如果你有From AND To

就是这种情况

在你的情况下

$date_start = start date;
$date_end = date_end;

$conditions = array(
    'conditions' => array(
        'Equipment.start_date >=' => array($date_start), 
        'Equipment.end_date <=' => array($date_end)
    ));

$this->set('equipments', $this->Equipment->find('all', $conditions));

答案 4 :(得分:1)

如果您使用的是cakephp 2.0,这就是答案http://book.cakephp.org/2.0/en/core-libraries/helpers/time.html#TimeHelper::daysAsSql

如果您使用的是cakephp 1.3,则可以使用TimeHelper,只需导入它并使用与此处文档中的示例相同的功能http://book.cakephp.org/1.3/en/view/1471/Formatting

答案 5 :(得分:1)

您无法使用具有此BETWEEN语法的数据库列。如果在数组中指定字符串,CakePHP将引用它们。数值相同,具体取决于您的数据库设置。

  

CakePHP将根据数据库中的字段类型引用数值    - 见http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

如果您仍想使用BETWEEN,可以将查询写入数组键,因为CakePHP不会转义键,而只会转义值。

  

CakePHP仅转义数组值。您应永远将用户数据放入密钥中。这样做会使您容易受到SQL注入的影响    - 见http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

关于你的问题:

$this->Model->find('all', array(
    'conditions' => array(
        '"YYYY-MM-DD" BETWEEN Model.date_start AND Model.date_end',
    ),
));

您甚至可以使用MySQL日期和时间函数:

$this->Model->find('all', array(
    'conditions' => array(
        'CURDATE() BETWEEN Model.date_start AND Model.date_end',
    ),
));

如果您使用日期/时间功能,请不要引用它们。如果您使用特定日期,请将其放在引号中。