我正在构建一个小型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));
答案 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));
答案 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',
),
));
如果您使用日期/时间功能,请不要引用它们。如果您使用特定日期,请将其放在引号中。