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

如何修改SQL实现周一至周日单日最大值的求和?

嘿,我来帮你调整这个SQL,让它统计周一到周日的单日最大值之和。

你的原代码用了WEEK(..., 1),理论上已经是按周一作为一周的第一天来计算,但可能因为MySQL的默认周模式或者你对结果的理解偏差,导致统计的是周日到周六的范围。这里给你两种靠谱的修改方案:

方案1:优化现有WEEK()函数的筛选逻辑

我们可以更明确地锁定周一到周日的范围,同时保留你原有的子查询结构:

$sql = "SELECT SUM(Ener) AS enTot
        FROM (
            SELECT MAX(Ener) as en, WEEKDAY(DateTime) as day
            FROM $dailyTable
            -- 强制以周一为一周第一天,匹配$today所在周
            WHERE WEEK(DATE(DateTime), 1) = WEEK(DATE('$today'), 1)
            -- 明确筛选周一(WEEKDAY返回0)到周日(返回6)的日期
            AND WEEKDAY(DATE(DateTime)) BETWEEN 0 AND 6
            GROUP BY day
        ) AS subquery;";

方案2:直接指定周一到周日的日期范围(更直观可靠)

这种方式不依赖WEEK()函数的模式配置,直接计算出$today所在周的周一和周日,筛选更精准:

// 先计算当前周的周一和周日日期
$monday = date('Y-m-d', strtotime('monday this week', strtotime($today)));
$sunday = date('Y-m-d', strtotime('sunday this week', strtotime($today)));

$sql = "SELECT SUM(Ener) AS enTot
        FROM (
            SELECT MAX(Ener) as en, WEEKDAY(DateTime) as day
            FROM $dailyTable
            WHERE DATE(DateTime) BETWEEN '$monday' AND '$sunday'
            GROUP BY day
        ) AS subquery;";

小说明

如果原代码确实返回周日到周六的结果,大概率是MySQL默认的week_mode设置为0(周日为一周起始),即使你指定了模式1,跨年度的日期可能会出现偏差。方案2的日期范围筛选能彻底避免这类问题,结果更可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:25:16