我正在尝试从当前日期获取接下来 15 天的数据。我像这样使用我的查询
SELECT bom.bid,
bom.item,
bom.cost,
bom.location,
work_order_line_items.id,
work_order_line_items.item,
Date(work_order_line_items.required_date) AS date,
Sum(work_order_line_items.quantity) AS TQTY,
items.item_id,
items.in_stock
FROM bom
INNER JOIN work_order_line_items
ON bom.item = work_order_line_items.item
INNER JOIN items
ON work_order_line_items.item = items.item_id
WHERE Date(work_order_line_items.required_date) =
Date_add(Curdate(), INTERVAL 15 day)
GROUP BY work_order_line_items.required_date
required_date列中,我有数据.. 2014-12-28
、2014-12-31
、2015-01-03
、2015-01-07
但是运行查询后我没有得到任何结果。有人可以告诉我我错在哪里吗?
此查询中有三个问题。
首先,您在WHERE
子句中使用了平等而不是不平等。因此,您只会选择未来正好 15 天的日期。
其次,WHERE
子句会破坏在required_date
列上使用索引,因此需要进行表扫描。 如果你的表格中有几十个项目,这并不重要,但如果你得到数万个,你的表现就会受到影响。
更好的WHERE
子句可能是这样的:
WHERE work_order_line_items.required_date >= CURDATE()
AND work_order_line_items.required_date < CURDATE() + INTERVAL 16 DAY
这将从当天的午夜开始,到十六天午夜之前结束的所有物品。 它可以通过对required_date
列上的索引进行范围扫描来做到这一点。
第三,你滥用了MySQL扩展来GROUP BY。 您将在结果集中获得不可预测的值。 阅读此内容。 http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html
这是 GROUP BY 子句的更好版本。请注意,它提到了结果集中除聚合列之外的所有列。
GROUP BY bom.bid,
bom.item,
bom.cost,
bom.location,
work_order_line_items.id,
work_order_line_items.item,
DATE(work_order_line_items.required_date),
items.item_id,
items.in_stock
问题出在您的WHERE
子句中。您正在使用=
这意味着您仅检查未来 15 天内required_date
的项目。将=
更改为 <=
。
提示:如果您只希望工作订单从现在到将来 15 天,请添加另一个条件,该条件仅选择今天之后的日期:Date(work_order_line_items.required_date) >= Curdate()
。
就目前而言 - 它只查看表中日期与 15 天后匹配的记录。您可能想尝试将 Where 子句更改为:
WHERE DATE(work_order_line_items.required_date) between CURDATE() and DATE_ADD(CURDATE(),INTERVAL 15 DAY)
然后,这应该为您提供未来 15 天的日期范围。
您也可以使用>= 和 <=:
WHERE (DATE(work_order_line_items.required_date) >= CURDATE()) AND (DATE(work_order_line_items.required_date) <= DATE_ADD(CURDATE(),INTERVAL 15 DAY))
这些将为您提供接下来的 15 天,并排除今天之前的任何数据(其中 <= 将为您提供包括过去几天在内的所有内容)。