首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL数据库中使用while循环/将10年添加到所有日期时出错

在MySQL数据库中使用while循环/将10年添加到所有日期时出错
EN

Stack Overflow用户
提问于 2012-07-18 16:24:11
回答 3查看 723关注 0票数 1

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

我看了很久很难找到一个样本ERP数据库,我唯一能想到的就是MS MySQL DB的AdventureWorks端口。这是伟大的,有很多的数据,我可以使用样本。

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

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

我发现这个职位有一个非常类似的脚本,我认为我可以借用,但由于某些原因,我似乎无法将它移植到MySQL。

我把它归结为一小块代码。由于某些原因,我的MySQL将不会运行WHILE循环--而我不知道为什么。

代码语言:javascript
复制
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;

出现的错误:

代码语言:javascript
复制
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

任何帮助都将不胜感激。

Final Update*下面的答案是正确的,但是如果在任何地方都无意中发现了这个答案,我就找不到答案了,因为我无法在MySQL中构建动态SQL,所以在准备好的语句/等等之前,我无法找到答案。最后,我在我的CodeIgniter应用程序中编写了这个小脚本来处理它。

希望它能帮上忙:

代码语言:javascript
复制
$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/>'; 
  }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-18 16:38:51

只能在存储过程、函数或触发器中使用while循环。

您的代码片段似乎不是任何此类sp或触发器的一部分。

这就是错误。

请参考https://dev.mysql.com/doc/refman/5.6/en/while.html了解更多详细信息。

票数 2
EN

Stack Overflow用户

发布于 2012-07-18 16:29:46

代码语言:javascript
复制
UPDATE mytable SET mydate = DATE_ADD(mydate, INTERVAL 10 YEAR)
票数 0
EN

Stack Overflow用户

发布于 2012-07-18 16:38:23

或者在开始结束后添加一个分隔符?

代码语言:javascript
复制
WHILE @Counter <= @TotalCount DO
    BEGIN
      -- do stuff here
    END;
END WHILE;

第二,记住增加@计数器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11545996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档