You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii 2如何获取product_offer表中当日的全部数据

修正查询以获取product_offer表的当日数据

我来帮你搞定这个问题!你的查询没正确过滤created字段的日期范围,所以才会拉出非当日的记录,下面给你几种靠谱的修正方案,适配你可能用到的场景:

方案1:Yii框架原生查询(推荐,因为你的迁移代码是Yii风格的)

如果你用Yii的ActiveRecord(比如有ProductOffer模型),可以用两种方式实现:

方式A:指定当日时间范围

直接构造当日的起始和结束时间,用范围查询:

// 构造今日0点和23:59:59的时间字符串
$todayStart = date('Y-m-d 00:00:00');
$todayEnd = date('Y-m-d 23:59:59');

// 查询当日所有记录
$todayOffers = ProductOffer::find()
    ->where(['between', 'created', $todayStart, $todayEnd])
    ->all();

方式B:利用数据库日期函数

用Yii的Expression调用数据库的日期处理函数,写法更简洁:

use yii\db\Expression;

$todayOffers = ProductOffer::find()
    ->where(new Expression('DATE(created) = CURDATE()'))
    ->all();

方案2:原生SQL查询

如果你直接写原生SQL,根据你使用的数据库选择对应的写法:

MySQL/MariaDB

两种写法都可以,推荐第二种范围查询,因为它能利用created字段的索引,性能更好:

-- 写法1:用DATE函数提取日期部分
SELECT * FROM product_offer WHERE DATE(created) = CURDATE();

-- 写法2:时间范围匹配(性能更优)
SELECT * FROM product_offer 
WHERE created >= CURDATE() 
  AND created < CURDATE() + INTERVAL 1 DAY;

PostgreSQL

同样推荐范围查询:

-- 写法1:提取日期部分
SELECT * FROM product_offer WHERE DATE(created) = CURRENT_DATE;

-- 写法2:时间范围匹配
SELECT * FROM product_offer 
WHERE created >= CURRENT_DATE 
  AND created < CURRENT_DATE + INTERVAL '1 day';

SQL Server

-- 写法1:转换为日期类型
SELECT * FROM product_offer WHERE CONVERT(date, created) = CONVERT(date, GETDATE());

-- 写法2:时间范围匹配
SELECT * FROM product_offer 
WHERE created >= CAST(GETDATE() AS DATE) 
  AND created < DATEADD(day, 1, CAST(GETDATE() AS DATE));

为什么之前的查询会出错?

大概率是你之前的过滤条件没精确限定当日的完整时间范围,比如误用了created = NOW()(这只会匹配当前秒的记录,而非全天),或者过滤条件的逻辑有误,导致包含了其他日期的数据。

内容的提问来源于stack exchange,提问作者Aljay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:59