CakePHP 查找两个日期之间查询的条件
Posted
技术标签:
【中文标题】CakePHP 查找两个日期之间查询的条件【英文标题】:CakePHP find condition for a query between two dates 【发布时间】:2012-08-13 09:38:29 【问题描述】:我的数据库中有一个开始日期和一个结束日期,还有一个来自表单字段的 $date 变量。我现在正在尝试查询 $date 为数据库中的开始/结束日期或这两者之间的任何日期的所有行。
这与 daysAsSql 如何工作的文档中描述的内容相反。我不知道如何让它工作。以下行不能作为控制器中的查找条件:
'? BETWEEN ? AND ?' => array($date, 'Item.date_start', 'Item.date_end'),
非常感谢任何帮助。这让我发疯了。
这里是完整的查询和相应的 SQL:
$conditions = array(
'conditions' => array(
'and' => array(
'? BETWEEN ? AND ?' => array($date, 'Item.date_start', 'Item.date_end'),
'Item.title LIKE' => "%$title%",
'Item.status_id =' => '1'
)));
$this->set('items', $this->Item->find('all', $conditions));
WHERE (('2012-10-06' BETWEEN 'Item.date_start' AND 'Item.date_end') AND (`Item`.`title` LIKE '%%') AND (`Item`.`status_id` = 1))
【问题讨论】:
请提供完整的查询和用于查找记录的sql查询等效蛋糕。 ***.com/questions/1329635/… 这不是和你之前的***.com/questions/11899211/…完全重复吗??? 实际上我试图以一种更简单的方式重新表述这个问题,因为第一个问题没有去任何地方。我意识到当第二个问题得到正确答案时,您无法删除已经有答案的问题。抱歉重复了。我根据第二个回答了第一个。 【参考方案1】:$conditions = array(
'conditions' => array(
'and' => array(
array('Item.date_start <= ' => $date,
'Item.date_end >= ' => $date
),
'Item.title LIKE' => "%$title%",
'Item.status_id =' => '1'
)));
试试上面的代码,问问它是否不适合你。
编辑: 根据@Aryan 的要求,如果我们必须找到在 1 个月内注册的用户:
$start_date = '2013-05-26'; //should be in YYYY-MM-DD format
$this->User->find('all', array('conditions' => array('User.reg_date BETWEEN '.$start_date.' AND DATE_ADD('.$start_date.', INTERVAL 30 DAY)')));
【讨论】:
如果我在数据库中只有一个字段(只有开始日期而不是结束日期)并且我必须在两天之间找到结果,例如找到所有从 26 日注册的用户/ 5/2013 到 26/6/2013? @Aryan,我为你添加了一个解决方案。请询问您是否需要更多说明。谢谢【参考方案2】:这里是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));
Ref from
【讨论】:
【参考方案3】:CakePHP 2.x 查询的一般示例
$_condition = array("TABLENAME.id" => $id, "TABLENAME.user_id" => array_unique($_array), 'date(TABLENAME.created_at) BETWEEN ? AND ?' => array($start_date, $end_date));
$result_array = $this->TABLENAME->find("all", array(
'fields' => array("TABLENAME.id", "TABLENAME.user_id", 'TABLENAME.created_at'),
"conditions" => $_condition,
"group" => array("TABLENAME.id"), //fields to GROUP BY
'joins' => array(
array(
'alias' => 'T2',
'table' => 'TABLENAME2',
'type' => 'LEFT',
'conditions' => array('TABLENAME.t_id = TABLENAME2.t_id')
),
array(
'alias' => 'T3',
'table' => 'TABLENAME3',
'type' => 'LEFT',
'conditions' => array(
'IF(
TABLENAME.t3_id > 0,
T2.f_id = T3.f_id,
TABLENAME.ff_id = T2.ff_id
)'
)
),
),
'recursive' => 0
)
);
【讨论】:
【参考方案4】:cakephp 2.x
中的IN BETWEEN
查询更高效且易于理解
$testing_log_device_site_name = $testingLogData['TestingLogDevice']['Siteid'];
$conditions = array('TestingLogDevice.dateee BETWEEN ? and ?' => array($start_date, $end_date));
$results = $this->TestingLogDevice->find('all',
array(
'fields'=>array('dateee','timeee','Siteid'),
'conditions'=>array($conditions, 'TestingLogDevice.Siteid'=>$testing_log_device_site_name)
)
);
pr($results);
【讨论】:
【参考方案5】:$data=$this->post->find('all')->where([ 'id'=>$id,
'price between'=>$price1,'and'=>$price2])->toArray();
此查询的工作原理如下:
select * from post where id=$id and price between $price1 and $price2;
" -- 'price between'=>$price1 --" 变为 "price between $price1"
【讨论】:
【参考方案6】:使用这个
$today = new DateTime( date('Y-m-d'));
$fiveYearsBack = $today->sub(new DateInterval('P5Y'));
【讨论】:
使用两个 sn-ps 的“AND”子句,已经接受的答案是正确的。您刚刚发布的内容不仅错误,而且还没有添加任何有价值的信息,而是将其放回当前视图。以上是关于CakePHP 查找两个日期之间查询的条件的主要内容,如果未能解决你的问题,请参考以下文章