如何使用日期格式处理查询生成器

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=]

另见