如何从当前日期 PHP 获取最近 7 周、7 个月的日期范围?

How to get the last 7 weeks, 7 months date range from current date PHP?

如何从当前日期获取最近七周/月的日期范围,我已经完成了最近七天

获取按特定 7 天、特定 7 周和特定 7 个月分组的过去 7 天、几周和一个月的销售总额

例如:

Today : 08/18/2021

过去七周

08/08/2021 - 08/14/2021
08/01/2021 - 08/07/2021
etc.

过去七个月

07/01/2021 - 07/31/2021
06/01/2021 - 06/30/2021
etc.

我最近 7 天完成的以下查询

$today = date("Y-m-d");
$lastsevenDays = date('Y-m-d', strtotime('-7 days'));
SELECT
    sales.salesDay as sales_day,
    ROUND(sum( IFNULL( payment.tmpNetTotal, 0 ) ),2)AS sales,
    payment.createdDateTime as Day_date
    FROM
    srp_erp_pos_menusalesmaster AS sales
    JOIN ( SELECT SUM( IFNULL( amount, 0 ) ) AS tmpNetTotal,createdDateTime, menuSalesID FROM srp_erp_pos_menusalespayments WHERE createdDateTime BETWEEN '" . $lastsevenDays . "' AND '" . $today . "'  GROUP BY menuSalesID ) AS payment ON sales.menuSalesID = payment.menuSalesID 
                WHERE isHold = 0 AND sales.isVoid = 0 AND companyID = $companyID GROUP BY
                sales.salesDay ORDER BY
                payment.createdDateTime

现在同理,我在想办法获取最近7周和最近7个月的数据。

我设法拼凑了一个查询,希望它能满足您这几周的需求。首先是整个查询:

SELECT
  S.salesDay as sales_day,
  ROUND(sum(IFNULL(P.tmpNetTotal, 0)),2) AS sales,
  P.createdDateTime as Day_date
FROM 
  srp_erp_pos_menusalesmaster AS S
JOIN (SELECT 
        SUM(IFNULL(amount, 0)) AS tmpNetTotal,
        createdDateTime, 
        menuSalesID 
      FROM 
        srp_erp_pos_menusalespayments 
      WHERE 
        createdDateTime > DATE_SUB(NOW(), INTERVAL 7 WEEK)
      GROUP BY 
        menuSalesID) AS P ON S.menuSalesID = P.menuSalesID 
WHERE 
  S.isHold = 0 AND 
  S.isVoid = 0 AND 
  S.companyID = $companyID 
GROUP BY 
   FLOOR((TO_DAYS(CURDATE()) - TO_DAYS(DATE(S.salesDay))) / 7)    
ORDER BY 
  P.createdDateTime

我的假设是 sales.salesDay 包含正确的日期和时间。

我改变了两件事:

  • 在内部 SELECT 中,我将条件更改为 WHERE createdDateTime > DATE_SUB(NOW(), INTERVAL 7 WEEK),使用 MySQL 中的函数而不是 PHP.
  • 中的函数
  • 为了按周分组,我将分组更改为:GROUP BY FLOOR((TO_DAYS(CURDATE()) - TO_DAYS(DATE(S.salesDay))) / 7),使用 FLOOR() 函数。我将 date/time 转换为日期,然后再转换为天数。减去那些给你过去的日子,除以 7 并取 FLOOR() 给你几周。

几个月都可以做同样的事情。

代码未经测试,可能无法完美运行,但我希望这能为您指明方向。

如果您将每个“天”汇总为一个 table,那么很容易总结过去 N 天,无论是几周还是几个月。

如果摘要table有sum_dollarscount_items,则

SELECT
    SUM(sum_dollars) -- total dollars over the larger period
    SUM(count_items) -- how many items there were
    SUM(sum_dollars) / SUM(count_items) -- average price
    FROM summary_table
    WHERE date ...

(注意我在摘要table中没有avg_price因为AVG(avg_..)通常是错误的公式。)

因此,在白天构建和维护(每晚)摘要 table。参见 http://mysql.rjweb.org/doc.php/summarytables

PS。 “今天”是 SQL 中的 CURDATE()。更具体地说,那是今天早上的午夜。 “7 个月前”是 CURDATE() - INTERVAL 7 MONTH

可能的BUG:不要使用BETWEEN;它是 'inclusive'。相反,做一些像

WHERE createdDateTime >= CURDATE() - INTERVAL 7 MONTH
  AND createdDateTime  < CURDATE()

你应该试试这个:

$today           = date("Y-m-d");
$lastsevenDays   = date('Y-m-d', strtotime('-7 days'));
$lastsevenMonths = date('Y-m-d', strtotime('-7 months'));

// Last seven weeks
SELECT
    sales.salesDay as sales_day,
    ROUND(sum( IFNULL( payment.tmpNetTotal, 0 ) ),2)AS sales,
    payment.createdDateTime as Day_date
    FROM
    srp_erp_pos_menusalesmaster AS sales
    JOIN ( SELECT SUM( IFNULL( amount, 0 ) ) AS tmpNetTotal,createdDateTime, menuSalesID FROM srp_erp_pos_menusalespayments WHERE DATE(createdDateTime) >= DATE($lastsevenDays) AND DATE(createdDateTime) < DATE($today)  GROUP BY menuSalesID ) AS payment ON sales.menuSalesID = payment.menuSalesID 
                WHERE isHold = 0 AND sales.isVoid = 0 AND companyID = $companyID GROUP BY
                sales.salesDay ORDER BY
                payment.createdDateTime;

// Last seven Months

SELECT
    sales.salesDay as sales_day,
    ROUND(sum( IFNULL( payment.tmpNetTotal, 0 ) ),2)AS sales,
    payment.createdDateTime as Day_date
    FROM
    srp_erp_pos_menusalesmaster AS sales
    JOIN ( SELECT SUM( IFNULL( amount, 0 ) ) AS tmpNetTotal,createdDateTime, menuSalesID FROM srp_erp_pos_menusalespayments WHERE DATE(createdDateTime) >= DATE($lastsevenMonths) AND DATE(createdDateTime) < DATE($today)  GROUP BY menuSalesID ) AS payment ON sales.menuSalesID = payment.menuSalesID 
                WHERE isHold = 0 AND sales.isVoid = 0 AND companyID = $companyID GROUP BY
                sales.salesDay ORDER BY
                payment.createdDateTime;