我去年创建了这个查询,用于从数据库中选择前6个月。
SELECT months.month_name,
COALESCE(SUM(job_details.price_each*job_details.quantity),0) AS sum_monthly_price, customer.company_name
FROM months
CROSS JOIN customer
LEFT JOIN job on job.company_id = customer.company_id
AND months.month = month(job.order_date)
AND job.order_date > DATE_SUB(NOW(), INTERVAL 6 MONTH)
LEFT JOIN job_details on job.job_id = job_details.job_id
WHERE months.month > month(DATE_SUB(NOW(), INTERVAL 6 MONTH))
AND months.month <= month(NOW())
AND customer.company_id = 2
GROUP BY months.month
ORDER BY months.month asc
问题似乎与where子句WHERE months.month > month(DATE_SUB(NOW(), INTERVAL 6 MONTH)) AND months.month <= month(NOW())
在新的一年之前它似乎正在工作,因为它看起来在06月到12月之间。但是现在我试图在07年到01年之间寻找。
当我的查询运行时,现在我们处于新的一年,它不会返回任何结果。如果我将我的位置改为WHERE months.month > month(DATE_SUB(NOW(), INTERVAL 6 MONTH))
,就像在约会时一样,它会将所有内容返回到第12个月,因为显然我做的比这更大,而且它会忽略第01个月。
我不知道为什么我的原始查询无法正常工作,因为它仍然应该执行大于一个日期而不是另一个日期。
任何人都可以解决我做错的事情。
答案 0 :(得分:2)
原始查询不起作用的原因,因为它确实比7月和小于1月&#34;,这显然不会返回任何结果。 如果您只想获得过去六个月的结果(例如,从7月18日到1月18日),您可以直接替换
WHERE months.month > month(DATE_SUB(NOW(), INTERVAL 6 MONTH))
AND months.month <= month(NOW())
与
WHERE job.order_date BETWEEN DATE_SUB(NOW(), INTERVAL 6 MONTH) AND NOW()
如果您确实想要获取过去六个月的数据(例如,从7月1日到1月18日),那么您可以执行以下操作:
WHERE job.order_date BETWEEN DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 6 MONTH), "%Y-%m-01 00:00:00") AND NOW()
更新:根据评论中的讨论,要求也是选择空月。这就是如何编写这样的查询:
SELECT months.month_name,
COALESCE(SUM(job_details.price_each*job_details.quantity),0) AS sum_monthly_price, customer.company_name
FROM months
CROSS JOIN customer
LEFT JOIN job on job.company_id = customer.company_id
AND months.month = month(job.order_date)
AND job.order_date > DATE_SUB(NOW(), INTERVAL 6 MONTH)
LEFT JOIN job_details on job.job_id = job_details.job_id
WHERE (DATE_FORMAT(NOW(), CONCAT("%Y-", month, "-%d")) BETWEEN DATE_SUB(NOW(), INTERVAL 6 MONTH) AND NOW() OR DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 YEAR), CONCAT("%Y-", month, "-%d")) BETWEEN DATE_SUB(NOW(), INTERVAL 6 MONTH) AND NOW())
AND customer.company_id = 2
GROUP BY months.month
ORDER BY months.month asc