在日期之间查询不起作用,现在我们在新的一年

时间:2015-01-18 21:12:46

标签: mysql sql

我去年创建了这个查询,用于从数据库中选择前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个月。

我不知道为什么我的原始查询无法正常工作,因为它仍然应该执行大于一个日期而不是另一个日期。

任何人都可以解决我做错的事情。

1 个答案:

答案 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