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

Posted

技术标签:

【中文标题】如何从当前日期 PHP 获取最近 7 周、7 个月的日期范围?【英文标题】:How to get the last 7 weeks, 7 months date range from current date PHP? 【发布时间】:2021-10-20 04:45:50 【问题描述】:

如何获得从当前日期开始的最后七周/月的日期范围,我已经完成了过去 7 天

获取按 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 个月的方法。

【问题讨论】:

你无法解决的问题是什么? 我想获得过去七周和一个月的销售额,我想通过日期范围进行循环查询 这个数据库在查询吗?您在问题中没有提及数据库。我的观点是,你不能只说“我想要”,或者换句话说; “为我做这个”,你必须自己表现出一些努力,告诉我们你遇到了什么问题,你试图解决什么以及你失败的原因。然后我们可以帮助您。 我已经修改了问题,过去 7 天我已经完成了,但我无法弄清楚过去 7 周和几个月如何做,我在查询中传递了日期范围 这就是 Stack Overflow 专门将其称为“最小”可重现示例的原因。我们需要具有足够多的行 的架构来创建可验证的结果——足够的数据以在 3 组中生成可识别的差异/准确性。 @Khn 【参考方案1】:

如果您将每个“天”汇总在一个表中,那么很容易总结过去 N 天的情况,无论是几周还是几个月。

如果汇总表有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 ...

(请注意,我在汇总表中没有avg_price,因为AVG(avg_..) 通常是错误的公式。)

因此,每天(每晚)构建和维护一个汇总表。见http://mysql.rjweb.org/doc.php/summarytables

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

可能的BUG:不要使用BETWEEN;它是“包容性的”。相反,做类似的事情

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

【讨论】:

【参考方案2】:

我希望,我设法拼凑出一个查询,它可以在几周内满足您的需求。首先是整个查询:

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 &gt; DATE_SUB(NOW(), INTERVAL 7 WEEK),使用 MySQL 中的函数而不是 PHP。 要按周分组,我将分组更改为:GROUP BY FLOOR((TO_DAYS(CURDATE()) - TO_DAYS(DATE(S.salesDay))) / 7),使用 FLOOR() 函数。我将日期/时间转换为日期,然后转换为天数。减去那些给你过去的日子,除以 7 并取 FLOOR() 给你几周。

同样的事情可以持续几个月。

代码未经测试,可能无法完美运行,但我希望这能为您提供前进的道路。

【讨论】:

注意到一个错误,并更正了它。 GROUP BY 中的减法应该在括号之间。 感谢您的努力,顺便说一下,这并没有按预期工作,这只会给出一个结果,而不是按天分组【参考方案3】:

你应该试试这个:

$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;

【讨论】:

以上是关于如何从当前日期 PHP 获取最近 7 周、7 个月的日期范围?的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL查询中编写一个日期范围的代码,使其从当前日期向前追溯3周,并从当前日期向前追溯1周。

如果日期是月初,则获取当前周的所有日期返回不正确

如何计算当前日期是当年的第几周

如何返回从当前日期开始最近 7 天内添加到数据库的所有记录

如何在SQL中获取当前日期最近六个月的前一个月数据

asp获取当前日期并自动加1个月如何写