php 怎么获取当前月份往前24个月中的每个月的订单总和? 回复内容

1楼小神游 3月17日回答

直接上代码咯,看着代码和注释能清晰一点。

$orders = array(); // 储存每个月的订单
$current_year  = (int) date('Y-m', time()); // 当前年份
$current_month = (int) date('Y-m', time()); // 当前月份

for ($i = 1; $i < 25; $i++) { // 循环24次
    
    // 获取本月最后一天24点的时间戳(为什么这样获取呢?看示例,例如:1月31日24点 = 2月1日0点)
    $timestamp_end = strtotime($current_year . $current_month); // 注意current_year和month都是上次循环的
    // 本次循环要获取订单数的月份
    $current_month = $current_month - $i; 
    if ($current_month === 0) { // 月份减一等于零,证明是要从1月跳到上一年的12月
        $current_month = 12; // 本次要获取订单数的月份
        $current_year  = $current_year - 1; // 本次要获取订单数的年份
    }
    // 获取本月第一天0点的时间戳
    $timestamp_start = strtotime($current_year . $current_month); // 获取这个月刚开始时的时间戳
    // 根据时间戳获取订单(传入的时间戳区间就是这个月的)
    $sql = "SELECT * FROM orders WHERE create_time >= $start_timestamp AND create_time <= $end_timestamp";
    // 后面查这段sql就可以获取当月订单了,(假设这个query()是执行sql的方法)
    $orders[$current_year][$current_month] = query($sql);
}

哈哈,希望对你有帮助。

2楼拾指相扣 3月17日回答

循环24次读SQL 这是累死MYSQL的节奏;
你的订单表肯定有记录订单日期的字段,如果没有至少也有订单时间戳的字段;然后按照年月group by就可以了
$yesterday , $twoyearsago 这两个时间你自己替换

-- 假设你的表记录日期的字段叫date
select substr(date, 1, 7) as yearmonth,
        count(*)
    from `your_table_name`
    where date between $yesterday and $twoyearsago
    group by yearmonth