如何从当前日期 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_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 ...
(注意我在摘要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;
如何从当前日期获取最近七周/月的日期范围,我已经完成了最近七天
获取按特定 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_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 ...
(注意我在摘要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;