如何在 MySQL 中精确统计今日订单总金额(PHP Yii2 实战教程)

发布时间 - 2026-01-28 00:00:00    点击率:

本文详解如何使用 yii2 query 构建精准的“今日销售额”查询,避免因时间戳精度、分组逻辑或字段误用导致的统计偏差,确保即使当日无订单也能返回 `0` 而非昨日数据。

要准确获取 MySQL 表中 orders 表今日(仅限当前日期,忽略具体时分秒)已完成订单的 price 字段总和,关键在于:不能依赖 GROUP BY + ORDER BY + LIMIT 1 的组合逻辑——该方式会返回「最近有数据的那一天」,而非「今天」;同时,直接用 FROM_UNIXTIME(updated_at, '%Y-%m-%d') 在 WHERE 条件中做匹配也不可行,因其属于表达式字段,无法高效利用索引且易引发类型隐式转换问题。

✅ 正确做法是:在 WHERE 子句中显式限定今日的时间范围,并使用 COALESCE(SUM(price), 0) 确保无记录时返回 0。

以下是推荐的 Yii2 实现(兼容 Unix 时间戳与 DATETIME 字段):

✅ 方案一:updated_at 为 Unix 时间戳(INT 类型)

public function getTotalEarningsToday()
{
    $todayStart = strtotime(date('Y-m-d 00:00:00')); // 今日 00:00:00 时间戳
    $todayEnd   = strtotime(date('Y-m-d 23:59:59')); // 今日 23:59:59 时间戳

    $records = (new Query())
        ->select(['COALESCE(SUM(price), 0) AS total', 'DATE(FROM_UNIXTIME(updated_at)) AS day'])
        ->from(Orders::tableName())
        ->where([
            'AND',
            ['status' => Orders::STATUS_COMPLETED],
            ['>=', 'updated_at', $todayStart],
            ['<=', 'updated_at', $todayEnd],
        ])
        ->groupBy('day') // 可选:确保单日聚合
        ->one(); // 使用 one() 而非 all(),因只查今日一行

    // 若无记录,$records 为 false → 手动补全
    if (!$records) {
        return ['total' => 0, 'day' => date('Y-m-d')];
    }

    return $records;
}

✅ 方案二:created_at / updated_at 为 DATETIME 类型(更推荐)

public function getTotalEarningsToday()
{
    $today = date('Y-m-d');
    $records = (new Query())
        ->select(['COALESCE(SUM(price), 0) AS total', new \yii\db\Expression("'$today' AS day")])
        ->from(Orders::tableName())
        ->where([
            'AND',
            ['status' => Orders::STATUS_COMPLETED],
            ['>=', 'created_at'

, $today . ' 00:00:00'], ['<=', 'created_at', $today . ' 23:59:59'], ]) ->one(); return $records ?: ['total' => 0, 'day' => $today]; }

⚠️ 注意事项:

  • 勿用 FROM_UNIXTIME(...) 在 WHERE 中做等值匹配:如 'updated_at' => strtotime('2025-02-21') 仅匹配 updated_at = 1645401600(即恰好整日零点),而实际订单时间戳多为 1645412345,必然漏查。
  • 优先使用 created_at 而非 updated_at:订单完成状态变更可能触发 updated_at 更新,但销售额应归属下单日(即 created_at)。
  • 必须用 COALESCE(SUM(...), 0):MySQL 中 SUM() 对空结果集返回 NULL,需转为 0 才符合业务预期。
  • 索引优化建议:为 (status, created_at) 建联合索引,大幅提升查询性能。

最终调用示例:

$result = $this->getTotalEarningsToday();
echo "今日销售额:¥{$result['total']}({$result['day']})"; 
// 输出:今日销售额:¥0(2025-06-15) 或 今日销售额:¥249.50(2025-06-15)

此方案逻辑清晰、可读性强、健壮可靠,彻底解决“查到昨日数据而非今日零值”的核心痛点。


# mysql  # php  # yii  # unix  # 隐式转换  # NULL  # int  # 今日  # 而非  # 中做  # 昨日  # 也不  # 也能  # 可选  # 仅限  # 多为  # 因其 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么上传文件_Laravel图片上传及存储配置  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  高防服务器:AI智能防御DDoS攻击与数据安全保障  用yum安装MySQLdb模块的步骤方法  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  iOS中将个别页面强制横屏其他页面竖屏  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  历史网站制作软件,华为如何找回被删除的网站?  如何快速搭建安全的FTP站点?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  浅谈redis在项目中的应用  新三国志曹操传主线渭水交兵攻略  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何确认建站备案号应放置的具体位置?  Laravel Session怎么存储_Laravel Session驱动配置详解  JS弹性运动实现方法分析  JS中对数组元素进行增删改移的方法总结  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel怎么判断请求类型_Laravel Request isMethod用法  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么实现验证码(Captcha)功能  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  香港服务器WordPress建站指南:SEO优化与高效部署策略  java中使用zxing批量生成二维码立牌  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何在IIS中新建站点并配置端口与IP地址?  如何在阿里云通过域名搭建网站?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何自定义建站之星网站的导航菜单样式?  香港服务器租用每月最低只需15元?  实例解析angularjs的filter过滤器  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  简历在线制作网站免费版,如何创建个人简历?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何快速查询域名建站关键信息?  如何在IIS7上新建站点并设置安全权限?