由于时间自动转换为int值, 做一步转化,也可在调用时处理

use `test`;

CREATE table test.test1 as
SELECT state, id, `规格条码`,
`色号条码`,
`货号`,
`在售平台`,
`平台售价`,
DATE_ADD('1900-01-01', Interval data1.`上架时间` day) as `上架时间`,
`下架时间`,
`操作员`
FROM data1; CREATE table test.test2 as
SELECT state, id,
DATE_ADD('1900-01-01', Interval `时间` day) as `时间`,
`在售平台`,
`规格条码`,
`销量`,
`销售额`,
`撤销标志`
FROM data2;

  

  生成时间序列数据

USE `test`;
DROP TABLE IF EXISTS tmptb;
CREATE TEMPORARY TABLE tmptb (
id INT UNSIGNED AUTO_INCREMENT,
date DATE NOT NULL,
shop VARCHAR(20) NOT NULL DEFAULT 0,
sales INT UNSIGNED DEFAULT 0,
PRIMARY KEY ( id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
DELIMITER //
DROP PROCEDURE IF EXISTS DayRangeProc//
CREATE PROCEDURE DayRangeProc ( IN start_date DATE, IN end_date DATE)
BEGIN
DECLARE i, range_day INT;
SET i = 0;
SET range_day = (SELECT DATEDIFF(end_date, start_date));
WHILE i <= range_day DO
INSERT INTO tmptb(date) VALUES (ADDDATE(start_date, i));
-- SET @sqlcmd = CONCAT('INSERT INTO ', tmptb, ' (date) VALUES (', temp, ')');
-- PREPARE stmt FROM @sqlcmd;
-- EXECUTE stmt;
-- DEALLOCATE PREPARE stmt;
SET i = i + 1;
END WHILE;
END;
// DELIMITER ;
CALL DayRangeProc ('2010-09-01', '2010-09-10');
SELECT * FROM tmptb;

  

  从test1表与test2表,产生每个产品上架以来每天在每个平台的销售情况,如无销售数据则计销量为0

USE `test`;
DROP TABLE IF EXISTS result;
CREATE TABLE result (
-- 保存结果数据
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date DATE NOT NULL,
product_id VARCHAR(20) NOT NULL,
shop VARCHAR(20) NOT NULL DEFAULT 0,
price FLOAT NOT NULL,
sales INT(8) DEFAULT 0,
amount DOUBLE DEFAULT 0,
PRIMARY KEY ( id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS shop_name_tb;
CREATE TEMPORARY TABLE shop_name_tb AS (SELECT DISTINCT `在售平台` AS NAME FROM test2); -- 保存平台,类似于数组操作 DELIMITER //
DROP PROCEDURE IF EXISTS DayRangeProc//
CREATE PROCEDURE DayRangeProc()
BEGIN
DECLARE i, j, t INT;
DECLARE range_day INT;
DECLARE shop_num, prod_num INT;
DECLARE start_date, end_date DATE;
DECLARE prod_id, shop_name VARCHAR(20);
DECLARE price FLOAT; SET i = 0;
SET j = 0;
SET t = 0;
SET shop_num = (SELECT COUNT(*) FROM shop_name_tb);
SET prod_num = (SELECT COUNT(*) FROM test1);
SET end_date = (SELECT MAX(`时间`) FROM test2 ); -- 由于下架时间均为空,假设都在销
-- 产品循环
WHILE i <= prod_num DO
SET prod_id = (SELECT `规格条码` FROM test1 LIMIT i,1); -- 第i个商品名称
SET start_date = (SELECT `上架时间` FROM test1 WHERE `规格条码` = prod_id); -- 第i个商品的上架时间
SET range_day = (SELECT DATEDIFF(end_date, start_date)); -- 第i个商品累计销售天数,以便插入相应长度的数据 -- 平台循环
WHILE j <= shop_num DO
SET shop_name = (SELECT name FROM shop_name_tb LIMIT j,1); -- 店铺名称
SET price = (SELECT `平台售价` FROM test1 WHERE `规格条码` = prod_id); -- 第i个商品售价,假设不同平台售价相同 -- 时间循环
WHILE t <= range_day DO
INSERT INTO result(date, product_id, shop, price)
VALUES (ADDDATE(start_date, t), prod_id, shop_name, price); -- sales, amount
SET t = t + 1;
END WHILE; SET j = j + 1;
END WHILE;
SET i = i + 1;
END WHILE;
END;
// DELIMITER ;
CALL DayRangeProc (); -- 查询数据
SELECT
result.id,
result.date,
result.product_id,
result.shop,
result.price,
IF(ISNULL(test2.`销量`), result.sales, test2.`销量`) AS sales,
IF(ISNULL(test2.`销售额`), result.amount, test2.`销售额`) AS amount
FROM result LEFT JOIN test2
ON result.date = test2.`时间`
AND result.shop = test2.`在售平台`
AND result.product_id = test2.`规格条码`;

  

  给定字符串,拆分后输出一列

USE test;
DROP TABLE IF EXISTS TEMP;
CREATE TABLE TEMP (
ID INT (8) NOT NULL AUTO_INCREMENT,
number VARCHAR(20) NOT NULL,
PRIMARY KEY (ID)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '测试'; DELIMITER $$
DROP PROCEDURE IF EXISTS `Pr_Rand_insert`$$
CREATE PROCEDURE `Pr_Rand_insert` ( IN insert_string VARCHAR (10000)) -- 定义输入
BEGIN
DECLARE I INT (8) DEFAULT 1 ;
DECLARE J INT (8) DEFAULT 0 ;
SET J = CHAR_LENGTH(insert_string) - CHAR_LENGTH( REPLACE (insert_string, ',', '')) + 1; -- 计算共有多少位为",",则再加上1就表示共有多少个数值需要插入
WHILE (I <= J) DO
INSERT INTO TEMP(number) VALUES (SUBSTRING_INDEX(SUBSTRING_INDEX(insert_string, ',', I), ',', - 1)) ; -- 用到了substring_index()函数
SET I = I + 1 ;
END WHILE ;
-- SELECT CONCAT('共插入了', J, '个值,请确认');
END$$
DELIMITER ; CALL Pr_Rand_insert ('231,24,1114,151,7831241,9134,989');
SELECT * FROM TEMP;

  

mysql 生成时间序列数据 - 存储过程的更多相关文章

  1. mysql 批量插入数据存储过程

    create procedure pFastCreateNums (cnt int unsigned) begin declare s int unsigned default 1; truncate ...

  2. SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法

    create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...

  3. 利用TPC-H为MYSQL生成数据

    ## 利用TPC-H为MYSQL生成数据 导言 这篇文章是看了joyee写的TPC-H数据导入MySQL教程以及另一篇网上的MySQL TPCH测试工具简要手册 后写的,有些内容是完全转载自以上两篇文 ...

  4. MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器

    ———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...

  5. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  6. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  7. 提高MYSQL百万条数据的查询速度

    提高MYSQL百万条数据的查询速度 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 nul ...

  8. mysql生成随机测试数据

    一个demo: CREATE TABLE dept_InnoDB(  deptno MEDIUMINT NOT NULL DEFAULT 0 ,  dname VARCHAR(20) NOT NULL ...

  9. mysql生成百万级数量测试数据

    今天因为项目需要,想测试一下读取百万级数量数据的速度如何,无奈数据库没有现成符合要求的数据,网上百度一番有很都不错的文章,但是需要涉及到一些存储过程和用php代码什么的,虽说可以实现,但是感觉另外再弄 ...

随机推荐

  1. 自动化运维之ansible

    第三十九课 自动化运维之ansible 目录 十五. ansible介绍 十六. ansible安装 十七. ansible远程执行命令 十八. ansible拷贝文件或目录 十九. ansible远 ...

  2. 小白的Redis学习(一)-SDS简单动态字符串

    本文为读<Redis设计与实现>的记录.该书以Redis2.9讲解Redis相关内容.请注意版本差异. Redis使用C语言实现,他对C语言中的char类型数据进行封装,构建了一种简单动态 ...

  3. 马凯军201771010116《面向对象与程序设计Java》第九周学习总结

    一.理论知识部分 异常.日志.断言和调试 1.异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行. 2.Java的异常处理机制可以控制程序从错误产生的位置转移到能够进行错误处理的位置. 3 ...

  4. org.activiti.engine.activitiexception:version of activiti database(5.22) is more recent than the engine(5.12)

    公司项目启动出现报错,百度查询结果如下:链接地址 org.activiti.engine.ActivitiException: Version of activiti database (5.15.1 ...

  5. bind啊你返回的函数到底是个虾米

    一般apply().call()和bind()会一起比较. 他们三个都是改变this对象指向的方法. apply()和cal()方法是会立即执行,apply把参数作为数组,call方法接收一个一个的参 ...

  6. PostgreSQL注入基础

    一般注入多用于在mssql和mysql两类数据库中,如mssql+asp.mysql+php则是最为常见的搭配环境.不同的网站应用的数据库也大不一样,根据数据库的处理能力.负载等多重因素决定.本文主要 ...

  7. python基础一之课后作业:编写登录接口

    1 # Author : Mamba 2 3 #python基础一之课后作业:编写登录接口 4 5 # 输入用户名密码 6 # 认证成功后显示欢迎信息 7 # 用户名3次输入错误后,退出程序 8 # ...

  8. css解决多行溢出显示省略号

    多行溢出 仅作为记录方便查找 display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: number; /*n行溢 ...

  9. 从零开始写自己的PHP框架系列教程(一)[core.php]

    这里我直接上代码: /** * 框架核心 */ if (version_compare(PHP_VERSION, '5.3.0','<')) { header("Content-Typ ...

  10. android获取Context

    如果在Activity方法中,直接使用this. 如果在Activity内部类中,使用Activity.this