1

我正在尝试为客户设置一些软件的演示,并且需要实时报告数据来做到这一点。这是一种商业软件,它依赖于通常驻留在 ERP 类型系统中的信息,其中有销售订单和采购订单(以及构建这些东西的所有数据)。

我花了很长时间寻找一个示例 ERP 数据库,我唯一能想到的就是 MS AdventureWorks DB 的 MySQL 端口。这很棒,并且有很多我可以用来采样的数据。

问题是,订单上的所有日期都是从 2001 年到 2004 年。

我想做的是编写一个简单的 MySQL 脚本,该脚本将遍历整个 AdventureWorks DB 中的每个日期时间字段,并将其添加 10 年。这将使日期范围(2011-2014)更加合理。

我发现这篇文章有一个非常相似的脚本,我认为我可以从中借用,但由于某种原因,我似乎无法将它移植到 MySQL。

我把它归结为这一小段代码。出于某种原因,我的 MySQL 不会运行 WHILE 循环——我不知道为什么。

USE adventureworks;

CREATE TEMPORARY TABLE ColumnList 
       (
      TableName NVARCHAR (100),
      columnName NVARCHAR (100)
       );


INSERT INTO ColumnList
        select t.table_name,c.column_name
        from information_schema.tables t inner join information_schema.columns c on t.table_name=c.table_name
        where c.column_type = 'datetime';

SET @Counter = 1;
SET @TotalCount = (SELECT COUNT(*) FROM ColumnList C);

BEGIN
    -- do stuff here
    @Counter = @Counter + 1;
END
END WHILE;

出现的错误:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHILE @Counter <= @TotalCount DO
BEGIN
  -- do stuff here
END
END WHILE' at line 1

任何帮助,将不胜感激。

最终更新 * 下面的答案是正确的,但万一在任何地方偶然发现了这个寻找答案,我找不到一个没有准备好的语句/等非常复杂的答案,因为我无法在 MySQL 中构建动态 SQL。我最终在我的 CodeIgniter 应用程序中编写了这个小脚本来处理它。

希望它可以帮助某人:

$this->load->database();    

$sql = "select t.table_name,c.column_name
from information_schema.tables t inner join information_schema.columns c on t.table_name=c.table_name
where c.table_schema='adventureworks' and c.column_type = 'datetime';";

$columnlist = $this->db->query($sql);

foreach ($columnlist->result_array() as $row) 
{
  //Now you have list of columns and tables, need to go in to each table, get all
  //results and update
  $column = $row['column_name'];
  $table = $row['table_name'];

  $sql = 
    "select distinct $column as 'thisdate', DATE_ADD($column, INTERVAL 10 YEAR) as 'newdate'
    from $table";

  $valuelist = $this->db->query($sql);
  $results = $valuelist->result_array();

  foreach ($results as $value) 
  {        
    $thisdate = date ("Y-m-d H:i:s", strtotime($value['thisdate']));
    $newdate = date ("Y-m-d H:i:s", strtotime($value['newdate']));

    $updatestmt =
      'update '.$table.' set '.$column." = '". $newdate ."' where $column = '".$thisdate."'";

    echo $updatestmt;
    $this->db->query($updatestmt);
    echo ' -- rows affected '.$this->db->affected_rows().'<br/>'; 
  }
}
4

3 回答 3

2

您只能while在存储过程、函数或触发器中使用循环。
您的代码片段似乎不是任何此类 sp 或触发器的一部分。
因此是错误。

有关详细信息,请参阅WHILE 语法。

于 2012-07-18T16:38:51.163 回答
0
UPDATE mytable SET mydate = DATE_ADD(mydate, INTERVAL 10 YEAR)
于 2012-07-18T16:29:46.373 回答
0

也许在 BEGIN END 之后添加一个分隔符?

WHILE @Counter <= @TotalCount DO
    BEGIN
      -- do stuff here
    END;
END WHILE;

其次,记得增加@counter。

于 2012-07-18T16:38:23.403 回答