1

我之前没有写过任何MySql存储过程,所以我根本不知道它们。我有一个数据库表,其中有一些记录。主要列是dateTime- 这条记录何时保存在数据库中。

我编写了 MySql 存储过程来选择指定日期的每条记录:

CREATE PROCEDURE getMessages(IN dateFrom DATETIME)   
    SELECT * FROM EsbMessage WHERE dateTime <= dateFrom;

这是电话:

CALL getMessages('2012-10-04 13:11:09');

这工作正常,它返回我指定日期的记录。

我需要做的是:

  1. 如果记录超过一周,我需要更新另一列。
  2. 如果记录超过一年,我需要删除该记录。

我可以通过编程轻松地做到这一点,但在这种情况下,我必须使用存储过程来做到这一点。

所以我在想这样的事情:

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 天。

有人可以帮我解决这个问题吗?

4

2 回答 2

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);
于 2012-10-04T12:53:26.517 回答
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
于 2012-10-04T12:53:58.427 回答