0

我正在尝试编写一个UPDATE SQL 查询来清理我的数据库......

这是我尝试过的,但它确实给我带来了巨大的问题,最终没有兑现我所有WHEREs不应该更改的更改记录......

UPDATE Orders
SET Orders.OrderStatus = Cancelled
WHERE Orders.OrderStatus in (New,Pending,Processing,Payment Declined,Awaiting Payment,See Line Items,See Order Notes,Backordered)
AND Orders.Total_Payment_Received = 0

还有第三条。该子句效果不佳,它旨在获取所有超过 60 天的记录,看起来它不起作用,我不确定我为什么要执行代码。我不敢在这里发布那条线,因为我看起来很愚蠢。它是这样的:

AND Orders.OrderDate BETWEEN DATEADD(Day, -60, GetDate())

因此,只有 OrderDate 超过 60 天的记录才会受到影响。

如果有人可以帮助我编译一个可行的查询,将不胜感激......

4

3 回答 3

0

我不完全确定您是说第一次更新是否有效,或者是否只是订单日期检查导致问题,所以我将只解决订单日期。

如果您想要超过 60 天的记录...

and Orders.OrderDate < dateadd(day, -60, getdate())

但是,由于 getdate() 包含时间,您可能希望不考虑这一点......

and Orders.OrderDate < dateadd(day, -60, convert(char(10), getdate(), 101))

在这种情况下,转换函数会删除日期的时间部分。

此外,如果您的订单状态应该是字符串,那么它们需要用引号括起来,因此您的完整查询将如下所示:

UPDATE Orders 
SET Orders.OrderStatus = 'Cancelled'
WHERE Orders.OrderStatus in ('New','Pending','Processing','Payment Declined','Awaiting Payment','See Line Items','See Order Notes','Backordered') 
AND Orders.Total_Payment_Received = 0 
AND Orders.OrderDate < dateadd(day, -60, convert(char(10), getdate(), 101))

关于运行更新的一点建议。始终SELECT使用相同的WHERE子句运行第一个,以便您可以确定哪些行将受到影响。这将为您节省很多痛苦。如果需要更新的行太多,请使用SELECT TOP 5000或其他东西,这样您至少可以检查其中的一些。在更新之前始终确切知道要更新的内容。

于 2012-03-11T12:49:58.867 回答
0

如果您希望您的订单日期必须介于两者之间,today's date and 60 days before您应该执行以下操作。

WHERE start_date BETWEEN dateadd(day,-60,getdate()) AND getdate();
于 2012-03-11T12:51:55.707 回答
0

使用查询分析器并创建您要取消的订单的视图。意见很棒。使用视图,您可以一次构建一个数据子集,检查您的视图是否包含正确的数据子集。例如:

首先创建一个名为viewOrdersToCancel的视图,它显示了 Total_Payment_Received = 0 的所有订单。(这是通过将= 0放在过滤器列中来完成的)

执行SELECT * FROM viewOrdersToCancel来查看这些记录。

然后修改视图并在 DateAdd(d,-60, GetDate()), GetDate())条件之间添加 OrderDate。

再做一次SELECT * FROM viewOrdersToCancel来查看那些记录。

现在修改视图,在 in 子句中添加不同的OrderStatus值。

您的视图现在包含要设置为“已取消”的订单子集

只需运行带有内部连接的更新语句:(
假设您有一个唯一的 OrderId

UPDATE Orders  
SET OrderStatus = 'Cancelled'  
FROM Orders t1  
INNER JOIN viewOrdersToCancel t2  
ON t1.OrderId = t2.OrderId
于 2012-03-11T13:43:43.153 回答