应朋友的要求,帮他采集的一些数据,直接使用的pandas进行的处理,直接入了库,由于比较懒,表结构之前没有进行设计。有一个日期的字段直接是默认以text的方式进行录入的,这个太占用空间了,后面改成了int(8),虽然相对好一些,不过总感觉还是别扭,空下来的时候重新设计了表结构,也顺带把这个数据处理。

mysql-date
mysql-date

上图上可以看出,当前时间格式是YYYYMMDD的格式,而mysql不是按此格式存的,mysql中的date格式是YYYY-MM-DD,占用3 bytes,比上面int(8)少了5个bytes。在处理之前需要先把老的数据进行格式转换,转换处理的SQL语句如下:

1select code,price,name,CONCAT(SUBSTRING(date,1,4),'-',SUBSTRING(date,5,2),'-',SUBSTRING(date,7,2))as date from stock;

使用该语句转换后的格式如下:

convert-date-mysql
convert-date-mysql

接下来使用create table as select语名创建一张新的表,把原来的数据导过去,后面再修改表名:

1CREATE table newstock as (select code,price,name,CONCAT(SUBSTRING(date,1,4),'-',SUBSTRING(date,5,2),'-',SUBSTRING(date,7,2))as date from stock) ;

注:这里需要注意下,使用CREATE TABLE A AS SELECT x,x,x,xx FROM B语句,不会把索引复制过来(CREATE TABLE A LIKE B语句可以复制表和索引),还需要使用alter增加下原有的索引信息。

修改完成后,去修改下date列的格式:

1----有以下两种方式修改数据格式
2alter table newstock change `date`  `date` date NOT NULL;
3alter table newstock modify column `date`  date NOT NULL;
4---- alter table 旧名 rename (to)新名,下面2种方式都可以
5alter table newstock rename stock;
6alter table newstock  rename to stock;

操作结果如下:

 1mysql> desc newstock;
 2+-------+-------------+------+-----+---------+-------+
 3| Field | Type        | Null | Key | Default | Extra |
 4+-------+-------------+------+-----+---------+-------+
 5| code  | varchar(10) | NO   |     | NULL    |       |
 6| price | float(8,2)  | YES  |     | NULL    |       |
 7| name  | varchar(20) | YES  |     | NULL    |       |
 8| date  | varchar(10) | YES  |     | NULL    |       |
 9+-------+-------------+------+-----+---------+-------+
104 rows in set (0.01 sec)
11mysql>
12mysql> alter table newstock modify column `date`  date NOT NULL;
13Query OK, 11114 rows affected (0.19 sec)
14Records: 11114  Duplicates: 0  Warnings: 0
15mysql> desc newstock;
16+-------+-------------+------+-----+---------+-------+
17| Field | Type        | Null | Key | Default | Extra |
18+-------+-------------+------+-----+---------+-------+
19| code  | varchar(10) | NO   |     | NULL    |       |
20| price | float(8,2)  | YES  |     | NULL    |       |
21| name  | varchar(20) | YES  |     | NULL    |       |
22| date  | date        | NO   |     | NULL    |       |
23+-------+-------------+------+-----+---------+-------+
244 rows in set (0.00 sec)

后面的date已经变成date格式了。