mysql查询以查找给定天数的开始和结束日期

时间:2018-03-15 18:05:46

标签: mysql

我正在尝试查询下表,根据每件商品有30天库存的时间给我一个开始日期和结束日期。 (库存不连续)

例如,如果我在过去的40天中有30个物品有库存,那么我将有第一个日期物品库存和物品存货的最后一天,当我们达到30天。结束日期应尽可能接近今天。我知道我可以在PHP代码中执行此操作,但表格会变大并且很难存储在内存中。

这在sql中是否可行?

 CREATE TABLE phppos_inventory_stock_log (
  id int(10) NOT NULL AUTO_INCREMENT,
  in_stock int(1) NOT NULL DEFAULT '0',
  date date NOT NULL,
  item_id int(10) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY in_stock (item_id,in_stock,date)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

mysql> select * FROM phppos_inventory_stock_log;
+----+----------+------------+---------+
| id | in_stock | date       | item_id |
+----+----------+------------+---------+
|  1 |        1 | 2018-03-10 |       2 |
|  2 |        1 | 2018-03-11 |       2 |
|  3 |        1 | 2018-03-12 |       2 |
|  4 |        1 | 2018-03-13 |       2 |
|  5 |        1 | 2018-03-10 |       1 |
|  6 |        0 | 2018-03-11 |       1 |
|  7 |        1 | 2018-03-12 |       1 |
|  8 |        1 | 2018-03-13 |       1 |

在以上示例中,库存商品项目ID为3天,其开始日期为2018-03-11至2018-03-13,商品ID为2018-03-10至2018-03-13

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,你需要一个项目库存为30x的日期。

首先,我们需要找到最新日期,当商品有库存时max(date),然后我们为每个商品选择,当我们有库存时,按天数排序,我们限制为我们感兴趣的范围(30天)并选择最早的日期。

SELECT max(`date`) AS max_date, item_id,
  (SELECT MIN(`date`)
   FROM phppos_inventory_stock_log AS chsl
   WHERE chsl.item_id = psl.item_id
     AND in_stock = 1
   ORDER BY `date` DESC
   LIMIT 30) AS min_date
FROM phppos_inventory_stock_log AS psl
WHERE in_stock = 1
GROUP BY item_id

注意:如果您有大量数据,则会终止数据库。限制返回结果的数量或检索特定item_id的列表。