面试题答案
一键面试- 数据清洗:
- 检查
orders_a
表中order_time_a
字段的数据格式是否都符合'YYYY - MM - DD HH:MM:SS'
。可以使用正则表达式进行初步筛选,在MySQL中可借助REGEXP
操作符。 - 例如,查看不符合格式的数据:
SELECT order_time_a FROM orders_a WHERE order_time_a NOT REGEXP '^[0 - 9]{4}-[0 - 9]{2}-[0 - 9]{2} [0 - 9]{2}:[0 - 9]{2}:[0 - 9]{2}$';
- 修正不符合格式的数据,假设不符合格式的数据为空字符串,可使用
UPDATE
语句进行修正:
UPDATE orders_a SET order_time_a = '1970 - 01 - 01 00:00:00' WHERE order_time_a NOT REGEXP '^[0 - 9]{4}-[0 - 9]{2}-[0 - 9]{2} [0 - 9]{2}:[0 - 9]{2}:[0 - 9]{2}$';
- 检查
- 数据迁移及类型转换:
- 使用
INSERT INTO...SELECT
语句进行数据迁移,同时利用STR_TO_DATE
函数将VARCHAR
类型的order_time_a
转换为DATETIME
类型。
INSERT INTO orders_b (order_time_b, 其他字段1, 其他字段2,...) SELECT STR_TO_DATE(order_time_a, '%Y - %m - %d %H:%i:%s'), 其他字段1的值, 其他字段2的值,... FROM orders_a;
- 这里假设
orders_b
表除了order_time_b
字段外还有其他字段,在SELECT
子句中要对应给出其他字段的值。如果orders_a
和orders_b
表结构完全一致(除了时间字段类型不同),且只迁移order_time_a
字段相关数据,可简化为:
INSERT INTO orders_b (order_time_b) SELECT STR_TO_DATE(order_time_a, '%Y - %m - %d %H:%i:%s') FROM orders_a;
- 使用