我正在尝试为客户设置一些软件的演示,并且需要实时报告数据来做到这一点。这是一种商业软件,它依赖于通常驻留在 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/>';
}
}