【问题标题】:Error using a while loop / Add 10 Years To All Dates in MySQL Database使用 while 循环时出错/将 10 年添加到 MySQL 数据库中的所有日期
【发布时间】:2012-07-18 16:24:11
【问题描述】:

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

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

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

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

我发现 this post 有一个非常相似的脚本,我认为我可以借鉴,但由于某种原因,我似乎无法将它移植到 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/>'; 
  }
}

【问题讨论】:

    标签: mysql sql erp


    【解决方案1】:

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

    更多详情请参考WHILE Syntax

    【讨论】:

      【解决方案2】:

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

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

      其次,记得增加@counter。

      【讨论】:

        【解决方案3】:
        UPDATE mytable SET mydate = DATE_ADD(mydate, INTERVAL 10 YEAR)
        

        【讨论】:

        • 谢谢,我在写日期更新部分时肯定会使用它,但问题不是如何进行更新.. 这是进入 WHILE 循环的错误,我无法通过.
        • 也许你应该增加@Counter
        • 更新到这个,但我仍然有同样的错误。这是说 WHILE 语句的第一行有问题,但我尝试了几个示例(甚至直接来自 MySQL 文档)并且无法运行简单的 WHILE 循环。
        • @VPel - 如果是这种情况,请尝试编辑您的问题标题以反映这一点。
        猜你喜欢
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多