从当前日期获取下一个15天的数据

时间:2014-12-24 17:26:22

标签: php mysql

我想从当前日期获得接下来的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-282014-12-312015-01-032015-01-07

但是在运行查询后我没有得到任何结果。有人可以建议我在哪里错了吗?

3 个答案:

答案 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; =将为您提供包括过去几天在内的所有内容)。