如果您现在更新记录,您将获得想要的结果,但只是现在。因为如果你三年后查询相同的数据,你仍然会找到 Prezzo 乘以 0.9 的记录,但同时有一个 10 多年前的 Anno。
相反,您应该让数据保持原样,并使用在查询时进行计算的数据库视图。像这样的:
CREATE OR REPLACE VIEW Stagione_view AS
SELECT Anno,
YEAR(GETDATE()) - Anno AS differenza,
(CASE WHEN YEAR(GETDATE()) - Anno < 10
THEN 0.9 ELSE 1
END) * Prezzo AS Prezzo
FROM Stagione
现在,只要确保您始终查询 Stagione_view 而不是 Stagione,您就会获得想要的效果。
代码说明
CREATE OR REPLACE VIEW:这会在您的数据库中创建一个新对象:视图。就像表格一样,它有行和列。不同之处在于它的数据是使用SELECT 语句从其他表中动态检索的。因此,当您查询视图时,数据库实际上会在后台执行 SELECT 语句。
YEAR(GETDATE()) - Anno AS differenza:这是年差的计算。因为它是在视图中完成的,所以使用GETDATE() 的当前值始终是准确的。
然后是魔法部分:
CASE WHEN YEAR(GETDATE()) - Anno < 10
THEN 0.9 ELSE 1
END
这将检查年份差异是否小于 10。如果是,则取 0.9 的值,否则取 1 的值。然后在更大的表达式中使用此结果:
(CASE WHEN YEAR(GETDATE()) - Anno < 10
THEN 0.9 ELSE 1
END) * Prezzo AS Prezzo
... 0.9 或 1 乘以 Prezzo。当然,如果第一个值是 1,那么这只会导致与 Prezzo 已有的值相同,但否则你正在做 0.9 * Prezzo。不管它是什么,它在视图中被命名为Prezzo。所以当你查询视图时你会看到调整后的Prezzo值:
SELECT * FROM Stagione_view;
改写问题后
每年的第一天,检查Stagione.Anno与当年的差值,如果差值小于10且大于0更新Prezzo=Prezzo*0.9否则设置Prezzo = 0
在这种情况下,请在一年的第一天发出以下update 声明:
UPDATE Stagiane
SET Prezzo = CASE WHEN YEAR(GETDATE()) - Anno < 10
THEN 0.9 ELSE 0
END) * Prezzo
WHERE YEAR(GETDATE()) > Anno
您可以使用CREATE EVENT statement 安排执行此语句。
例如:
CREATE EVENT adjust_prezzo
ON SCHEDULE EVERY 1 YEAR
STARTS '2017-01-01 08:00'
DO
UPDATE Stagiane
SET Prezzo = CASE WHEN YEAR(GETDATE()) - Anno < 10
THEN 0.9 ELSE 0
END) * Prezzo
WHERE YEAR(GETDATE()) > Anno;