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
相关产品推荐
相关产品推荐

