如何使用日期格式处理查询生成器
How to handle Query builder with date formats
我只想显示开始日期从明天开始的事件。我该如何进行?目前它也考虑了 h:i:s。
public function display()
{
$now = date('Y-m-d H:i:s');
$this->loadModel('Events');
$events = $this->Events
->find()
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC'])
->where(['events.startdate >' => $now]);
$this->set('upcomingEvents', $events);
}
我试过了,但没用:
public function display()
{
$now = date('Y-m-d');
$this->loadModel('Events');
$events = $this->Events
->find()
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC'])
->where(['date_format("%Y-%m-%d", events.startdate)' => $now]);
$this->set('upcomingEvents', $events);
}
不确定这是否是正确的方法,但它使用函数 DATA_FORMAT()
DATE_FORMAT(events.startdate, "%Y-%m-%d")
下面是查询:
public function display()
{
$now = date('Y-m-d');
$this->loadModel('Events');
$events = $this->Events
->find()
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC'])
->where(['DATE_FORMAT(events.startdate, "%Y-%m-%d") >' => $now]);
$this->set('upcomingEvents', $events);
}
或者我们也可以在条件数组中使用它
public function display()
{
$this->loadModel('Events');
$events = $this->Events
->find('all', array('conditions' => array('DATE_FORMAT(events.startdate, "%Y-%m-%d") >' => date('Y-m-d'))))
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC']);
$this->set('upcomingEvents', $events);
}
无需格式化查询中的日期并失去索引功能,而是与使用 00:00:00
作为时间部分(例如一天的开始)的日期时间字符串进行比较。
您可以使用 date('Y-m-d 00:00:00')
轻松实现此目的,但是那是今天,而不是明天,您需要向 date()
提供时间戳,例如 date('Y-m-d 00:00:00', strtotime('+1 day'))
.
您还可以使用 CakePHP 附带的日期时间功能。今天 \Cake\Chronos\Date::tomorrow()
将创建一个表示 2021-10-06
的日期对象,其中时间部分始终为 00:00:00
.
->where(['Events.startdate >=' => \Cake\Chronos\Date::tomorrow()])
ORM 会自动根据列类型设置日期对象的格式,因此我想对于您的 DATETIME
列,它最终会在 SQL 中显示为 2021-10-06 00:00:00
。 =22=]
另见
我只想显示开始日期从明天开始的事件。我该如何进行?目前它也考虑了 h:i:s。
public function display()
{
$now = date('Y-m-d H:i:s');
$this->loadModel('Events');
$events = $this->Events
->find()
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC'])
->where(['events.startdate >' => $now]);
$this->set('upcomingEvents', $events);
}
我试过了,但没用:
public function display()
{
$now = date('Y-m-d');
$this->loadModel('Events');
$events = $this->Events
->find()
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC'])
->where(['date_format("%Y-%m-%d", events.startdate)' => $now]);
$this->set('upcomingEvents', $events);
}
不确定这是否是正确的方法,但它使用函数 DATA_FORMAT()
DATE_FORMAT(events.startdate, "%Y-%m-%d")
下面是查询:
public function display()
{
$now = date('Y-m-d');
$this->loadModel('Events');
$events = $this->Events
->find()
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC'])
->where(['DATE_FORMAT(events.startdate, "%Y-%m-%d") >' => $now]);
$this->set('upcomingEvents', $events);
}
或者我们也可以在条件数组中使用它
public function display()
{
$this->loadModel('Events');
$events = $this->Events
->find('all', array('conditions' => array('DATE_FORMAT(events.startdate, "%Y-%m-%d") >' => date('Y-m-d'))))
->contain(['Categories', 'Venues'])
->limit(5)
->order(['events.startdate' => 'ASC']);
$this->set('upcomingEvents', $events);
}
无需格式化查询中的日期并失去索引功能,而是与使用 00:00:00
作为时间部分(例如一天的开始)的日期时间字符串进行比较。
您可以使用 date('Y-m-d 00:00:00')
轻松实现此目的,但是那是今天,而不是明天,您需要向 date()
提供时间戳,例如 date('Y-m-d 00:00:00', strtotime('+1 day'))
.
您还可以使用 CakePHP 附带的日期时间功能。今天 \Cake\Chronos\Date::tomorrow()
将创建一个表示 2021-10-06
的日期对象,其中时间部分始终为 00:00:00
.
->where(['Events.startdate >=' => \Cake\Chronos\Date::tomorrow()])
ORM 会自动根据列类型设置日期对象的格式,因此我想对于您的 DATETIME
列,它最终会在 SQL 中显示为 2021-10-06 00:00:00
。 =22=]
另见