由于时间自动转换为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. java中的常用特殊字符

    1.转义字符反斜杠(\) 我们知道html中大都是双标签,如果在标签内想要输出带有标签结束符的文本都必须进行转义,html中是采用对应的字符替换,如<可用<替换 在java当中,我们要转义 ...

  2. MySQL关于root密码修改

    (转载) 方法一:在mysql系统外,使用mysqladmin修改mysqladmin -u root -p password "test123"Enter password: [ ...

  3. 泊爷带你学go -- 加锁的问题

    package main import ( "fmt" "sync" ) var l sync.Mutex var a string func f() { a ...

  4. 前端测试时,常用SQL

    与后台联调页面,经常会验证数据正确性,这时候就需要会点SQL语句,以下是常用的SQL: 单表查询 select * from table 条件查询 select * from table where ...

  5. SpringMVC后台接受前台传值的方法

    1.HttpRequestServlet 接收前台传值 @RequestMapping("/go5") public String hello5(HttpServletReques ...

  6. sort()的用法,参数以及排序原理(转载)

    sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函 ...

  7. [转]How to Send Ethereum with Web3.js and Node

    原文:https://davekiss.com/ethereum-web3-node-tutorial/   Ethereum took the web and cryptocurrency worl ...

  8. 【转】干货 | 【虚拟货币钱包】从 BIP32、BIP39、BIP44 到 Ethereum HD Wallet

    虚拟货币钱包 钱包顾名思义是存放$$$.但在虚拟货币世界有点不一样,我的帐户资讯(像是我有多少钱)是储存在区块链上,实际存在钱包中的是我的帐户对应的 key.有了这把 key 我就可以在虚拟货币世界证 ...

  9. Java 8 Lambda 表达式(一)

    Java 8 新特性 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表 ...

  10. 设计模式的uml图的关键(核心)

    每个设计模式的关键的部位就是,其变化点.用抽象来封装变化点 如下图的代理模式 关键点就是框图内的subject定义了 实际对象 和代理对象都具有的接口.才形成代理模式