¿Cómo puedo obtener el intervalo de fechas de las últimas siete semanas/meses a partir de la fecha actual? Ya lo he hecho con los últimos siete días.
obtener el total de ventas de los últimos siete días, semanas y meses agrupados por 7 días particulares, 7 semanas particulares y 7 meses particulares
ex:
Today : 08/18/2021Últimas siete semanas
08/08/2021 - 08/14/2021 08/01/2021 - 08/07/2021 etc.Últimos siete meses
07/01/2021 - 07/31/2021 06/01/2021 - 06/30/2021 etc.La siguiente consulta que he hecho durante los últimos siete días
$today = date("Ymd"); $lastsevenDays = date('Ym-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.createdDateTimeAhora, de la misma manera, estoy pensando en una forma de recuperar las últimas 7 semanas y los últimos siete meses.
Si tiene cada "día" resumido en una sola tabla, entonces es fácil resumir eso en los últimos N días, ya sea que haya varias semanas o meses.
Si la tabla de resumen tiene sum_dollars , count_items , entonces
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 ... (Tenga en cuenta que no tenía avg_price en la tabla de resumen porque AVG(avg_..) suele ser la fórmula incorrecta).
Por lo tanto, cree y mantenga (todas las noches) una tabla de resumen por día. Ver http://mysql.rjweb.org/doc.php/summarytables
PD. "hoy" es CURDATE() en SQL. Más específicamente, eso es medianoche esta mañana. "Hace 7 meses" es CURDATE() - INTERVAL 7 MONTH
PROBABLE ERROR: No use BETWEEN ; es 'inclusivo'. En su lugar, haz algo como
WHERE createdDateTime >= CURDATE() - INTERVAL 7 MONTH AND createdDateTime < CURDATE()Me las arreglé para improvisar una consulta que hace lo que quieres durante las semanas, espero. Primero toda la consulta:
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 Mi suposición es que sales.salesDay contiene una fecha y hora adecuadas.
Cambié dos cosas:
SELECT interna, cambié la condición a WHERE createdDateTime > DATE_SUB(NOW(), INTERVAL 7 WEEK) , usando funciones en MySQL en lugar de en PHP.GROUP BY FLOOR((TO_DAYS(CURDATE()) - TO_DAYS(DATE(S.salesDay))) / 7) , usando la función FLOOR() . Convierto fecha/hora en fechas y luego en un número de día. restando esos te dan los días en el pasado, divide por 7 y tomando el FLOOR() te da semanas.Lo mismo se puede hacer durante meses.
El código no está probado y es posible que no funcione a la perfección, pero espero que esto le brinde un camino a seguir.
Deberías probar esto:
$today = date("Ymd"); $lastsevenDays = date('Ym-d', strtotime('-7 days')); $lastsevenMonths = date('Ym-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;