如何修改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
相关产品推荐
相关产品推荐

