我的问题是
它使用相同的ID更新所有数据。因为我有一个具有相同ID的多个数据。 [见下图]。
我想只更新接近过期的行(30天)。我不想对那些已经过期的物品做任何事情。
这是我的代码:
for (int i = 0; i < dataGridViewPOS.Rows.Count; i++)
{
cmd = new MySqlCommand(@"UPDATE inventory2 SET quantity = @quantity WHERE itemid = @itemid ORDER BY expiry", sqlconnection);
//codehere
}
由于
更新
for (int i = 0; i < dataGridViewPOS.Rows.Count; i++)
{
cmd = new MySqlCommand(@"SELECT * FROM inventory2 WHERE itemid = @itemid ORDER BY expiry", sqlconnection);
//codehere
cmd = new MySqlCommand(@"UPDATE inventory2 SET quantity = @quantity WHERE itemid = @itemid AND CURDATE() < expiry ORDER BY expiry", sqlconnection);
//codehere
}
答案 0 :(得分:1)
您需要检查SQL中的过期时间 即
WHERE itemid = @itemid and CURDATE() < expiry
你的确切性质取决于你如何定义“近”
WHERE itemid = @itemid and DATE_ADD(CURDATE(),INTERVAL 30 DAY) < expiry
这将在到期后的30天内
一旦你有“近”日期,你就可以与选择最大值
组合AND expiry = (SELECT MAX(expiry) FROM inventory2 WHERE itemid = @itemid)
所以得到最大的
编辑:您添加的信息表示您要编辑未过期的记录,这与原始问题似乎意味着您需要执行的操作完全相反
expiry BETWEEN CURDATE() and DATE_ADD(CURDATE(),INTERVAL 30 DAY)
这将获得在接下来的30天内到期但尚未到期的所有内容
答案 1 :(得分:1)
也许更贴近:
UPDATE inventory2
SET [quantity] = @quantity
where [itemid] = @itemid
AND [expiry] between CURDATE() and DATE_ADD(CURDATE(),INTERVAL 30 DAY)
您的命令代码将更改为:
cmd = new MySqlCommand(@"UPDATE inventory2 SET quantity = @quantity WHERE itemid = @itemid AND [expiry] between CURDATE() and DATE_ADD(CURDATE(),INTERVAL 30 DAY", sqlconnection);
这将更新inventoryI匹配的inventory2中的所有行,并且有效期限小于当前日期加上30天。
编辑以反映评论的更新要求:项目未过期,项目在30天内到期
答案 2 :(得分:0)
肯定你会有一个唯一的id表。为什么不首先执行选择查询以获取唯一ID,然后使用唯一ID引用更新该行。实际上,您也应该能够在一个查询中合并它们。底线是使用唯一ID并在选择查询中仅返回1行,然后以接近过期的方式对其进行排序。