我想从当前日期获得接下来的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
但是在运行查询后我没有得到任何结果。有人可以建议我在哪里错了吗?
答案 0 :(得分:3)
此查询中有三个问题。
首先,您在WHERE
子句中使用了相等而不是不等式。因此,您只会选择将来恰好十五天的日期。
其次,您的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
列上的索引进行范围扫描来实现。
第三,你滥用了对GROUP BY的MySQL扩展。您将在结果集中获得不可预测的值。读这个。 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
答案 1 :(得分:0)
问题出在你的WHERE
条款中。您使用的是=
,这意味着您只检查将来有required_date
天的=
项。将<=
更改为Date(work_order_line_items.required_date) >= Curdate()
。
提示:如果您现在只需要从现在到15天的工作订单,请添加另一个仅在今天之后选择日期的条件:{{1}}。
答案 2 :(得分:0)
现在看来 - 它只是查看记录表,你的日期在15天后就会与之匹配。 您可能想尝试将Where子句更改为:
WHERE DATE(work_order_line_items.required_date) between CURDATE() and DATE_ADD(CURDATE(),INTERVAL 15 DAY)
然后应该在接下来的15天内给你一个日期范围。
您还可以使用&gt; =和&lt; =:
WHERE (DATE(work_order_line_items.required_date) >= CURDATE()) AND (DATE(work_order_line_items.required_date) <= DATE_ADD(CURDATE(),INTERVAL 15 DAY))
这些将在接下来的15天内为您提供,并排除今天之前的任何数据(其中&lt; =将为您提供包括过去几天在内的所有内容)。