PHP+MySQL实现单AJAX请求获取美东时区自定义周期的日/周/月销售转账数据
一次性获取多维度(日/周/月)销售转账统计的解决方案
针对你的需求,我们可以通过单条SQL语句结合精准的时区日期计算,配合一次AJAX请求完成所有维度的数据统计,同时满足自定义周期(月从10号启动、周从周一算起、纽约时区、工作日过滤)的要求。下面分步骤拆解实现方案:
1. 修正PHP日期周期计算(匹配需求规则)
你原来的月起始时间是当月1号,不符合“每月从10号开始统计”的要求,同时要确保所有日期计算严格基于America/New_York时区,修正后的代码如下:
date_default_timezone_set('America/New_York'); $current_datetime = date("Y-m-d H:i:s"); // 当前纽约完整时间(含时分秒) $current_date = date("Y-m-d"); // 当前纽约日期(仅年月日) // 日维度:当天00:00到23:59 $daily_start = $current_date . " 00:00:00"; $daily_end = $current_date . " 23:59:59"; // 周维度:本周一00:00到当前时间,后续在SQL中过滤工作日 $weekly_start = date("Y-m-d 00:00:00", strtotime('monday this week')); // 月维度:处理跨月逻辑(当前日<10时,统计上月10号到当月9号;否则统计当月10号至今) $current_day = intval(date('d')); if ($current_day < 10) { $monthly_start = date('Y-m-10 00:00:00', strtotime('-1 month')); $monthly_end = date('Y-m-09 23:59:59'); } else { $monthly_start = date('Y-m-10 00:00:00'); $monthly_end = $current_datetime; }
2. 单条SQL完成多维度统计
利用SQL的SUM(CASE...)语法,结合工作日过滤逻辑,一次性计算日、周、月的总转账数和已接受转账数(适配你的transfers表结构):
假设你的Date字段存储的是纽约时间的日期字符串(如果是UTC时间,需用CONVERT_TZ转换时区,示例里会标注):
// 用PDO执行查询(你也可以换成mysqli,逻辑一致) $sql = " SELECT -- 日维度统计 SUM(CASE WHEN Date BETWEEN ? AND ? THEN 1 ELSE 0 END) AS daily_total, SUM(CASE WHEN Date BETWEEN ? AND ? AND Accepted = 'Yes' THEN 1 ELSE 0 END) AS daily_accepted, -- 周维度统计(仅周一至周五,WEEKDAY返回0=周一,4=周五) SUM(CASE WHEN Date BETWEEN ? AND ? AND WEEKDAY(Date) BETWEEN 0 AND 4 THEN 1 ELSE 0 END) AS weekly_total, SUM(CASE WHEN Date BETWEEN ? AND ? AND Accepted = 'Yes' AND WEEKDAY(Date) BETWEEN 0 AND 4 THEN 1 ELSE 0 END) AS weekly_accepted, -- 月维度统计(自定义周期+工作日过滤) SUM(CASE WHEN Date BETWEEN ? AND ? AND WEEKDAY(Date) BETWEEN 0 AND 4 THEN 1 ELSE 0 END) AS monthly_total, SUM(CASE WHEN Date BETWEEN ? AND ? AND Accepted = 'Yes' AND WEEKDAY(Date) BETWEEN 0 AND 4 THEN 1 ELSE 0 END) AS monthly_accepted FROM transfers; "; // 如果Date是UTC时间,把所有Date替换为:CONVERT_TZ(Date, 'UTC', 'America/New_York') // 绑定参数(顺序要和SQL中的?完全对应) $params = [ $daily_start, $daily_end, $daily_start, $daily_end, $weekly_start, $current_datetime, $weekly_start, $current_datetime, $monthly_start, $monthly_end, $monthly_start, $monthly_end ]; $stmt = $pdo->prepare($sql); $stmt->execute($params); $stats = $stmt->fetch(PDO::FETCH_ASSOC);
注:如果用PostgreSQL数据库,需把
WEEKDAY(Date)替换为EXTRACT(DOW FROM Date),同时工作日条件改为BETWEEN 1 AND 5(PostgreSQL中1=周一,5=周五)。
3. 后端接口返回JSON数据
在dashboardStats接口中,直接将统计结果转为JSON返回:
header('Content-Type: application/json'); echo json_encode($stats); exit;
4. 前端AJAX接收并渲染数据
修改你的AJAX代码,接收返回的JSON数据并渲染到对应卡片:
$.ajax({ url: "<?= base_url(). "/dashboardStats";?>", method: "GET", dataType: "JSON", contentType: 'application/json' }).done( function(data) { // 渲染日统计数据 $(".dailyTotal").text(data.daily_total); $(".dailyAccepted").text(data.daily_accepted); // 渲染周统计数据 $(".weeklyTotal").text(data.weekly_total); $(".weeklyAccepted").text(data.weekly_accepted); // 渲染月统计数据 $(".monthlyTotal").text(data.monthly_total); $(".monthlyAccepted").text(data.monthly_accepted); }).fail(function(jqXHR, textStatus, errorThrown) { console.error("获取统计数据失败:", errorThrown); });
内容的提问来源于stack exchange,提问作者Aun Zaidi
相关产品推荐
相关产品推荐

