之前我没有写过任何MySql
存储过程,所以根本就不知道它们。我有一个数据库表,其中包含一些记录。主列为dateTime
- 此记录保存在数据库中。
我编写了MySql存储过程来选择指定日期的每条记录:
CREATE PROCEDURE getMessages(IN dateFrom DATETIME)
SELECT * FROM EsbMessage WHERE dateTime <= dateFrom;
这就是电话:
CALL getMessages('2012-10-04 13:11:09');
这样可以正常工作,它会返回指定日期的记录。
我需要做的是:
我可以通过编程方式轻松完成此操作,但在这种情况下,我必须使用存储过程执行此操作。
所以我想到这样的事情:
CREATE PROCEDURE updateMessages(IN dateFrom DATETIME)
BEGIN
SELECT * FROM EsbMessage WHERE dateTime <= dateFrom;
#for each message
#if the message is over one week old but not over one year old:
UPDATE EsbMessage SET body = '';
#if message is over one year old:
DELETE FROM EsbMessage WHERE dateTime = #message.dateTime
END
但我不知道如何在存储过程中使用for循环,以及如何根据我的要求编写if语句,而另一件事我现在不知道如何计算MySql中的日期。对于例如如果我有当前日期,那么我需要从当前日期减去365天。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
您不需要循环,只需在WHERE子句中输入条件:
#if the message is over one week old but not over one year old:
UPDATE EsbMessage SET body = ''
WHERE dateTime >= DATE_SUB(NOW(),INTERVAL 1 WEEK) AND dateTime <= DATE_SUB(NOW(),INTERVAL 1 YEAR);
#if message is over one year old:
DELETE FROM EsbMessage WHERE dateTime >= DATE_SUB(NOW(),INTERVAL 1 YEAR);
答案 1 :(得分:0)
如何循环和使用if子句在此处描述:http://www.mysqltutorial.org/stored-procedures-loop.aspx
我会在没有循环的情况下这样做:
CREATE PROCEDURE updateMessages(IN dateFrom DATETIME)
BEGIN
UPDATE EsbMessage SET body = '' where dateTime <= dateFrom -(86400*7); //86400 = 1 day
#if message is over one year old:
DELETE FROM EsbMessage where dateTime <= dateFrom -(86400*365);
END