如何从当前日期 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_dollars
、count_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 > 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 个月的日期范围?的主要内容,如果未能解决你的问题,请参考以下文章