3

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

当用户试图找出 2012 年 10 月 23 日是否有任何(例如)汽车可用,并且数据库保存 Start:2012-10-20和 End:的预订日期记录时,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));
4

6 回答 6

10

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

(作为查找中的一个条件:)

array('Equipment.date_start <= ' => $date,
      'Equipment.date_end >= ' => $date
     ),
于 2012-08-13T10:31:43.500 回答
3

如果您有一个日期并且想使用 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));
于 2013-09-06T11:02:57.437 回答
3

这是CakePHP BETWEEN查询示例。

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

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

参考自

于 2017-06-08T11:44:57.967 回答
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));
于 2012-08-10T10:49:04.453 回答
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

于 2012-08-10T12:41:32.460 回答
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',
    ),
));

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

于 2014-06-28T16:39:49.403 回答