首页 > 解决方案 > 如何使用日期格式处理查询生成器

问题描述

我只想显示 startdate 从明天开始的事件。我该如何进行?目前它也将 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);
}

标签: cakephpquery-buildercakephp-4.x

解决方案


无需在查询中格式化日期并失去索引功能,而是与00:00:00用于时间部分的日期时间字符串进行比较,例如一天的开始。

您可以使用 轻松实现这一点date('Y-m-d 00:00:00'),但是那是今天,而不是明天,您需要date()使用像date('Y-m-d 00:00:00', strtotime('+1 day')).

您还可以使用 CakePHP 附带的日期时间功能。Today\Cake\Chronos\Date::tomorrow()将创建一个日期对象,表示2021-10-06时间部分始终在哪里00:00:00

->where(['Events.startdate >=' => \Cake\Chronos\Date::tomorrow()])

ORM 将根据列类型自动格式化日期对象,因此对于您的我想DATETIME列,它最终会像2021-10-06 00:00:00在 SQL 中一样。

也可以看看


推荐阅读