MST

星途 面试题库

面试题:MySQL日期和时间处理函数在数据迁移与整合中的挑战与应对

现有两个不同数据源的数据库,一个旧系统数据库A和新系统数据库B。旧系统中订单表orders_a的下单时间字段order_time_a是VARCHAR类型,格式为'YYYY - MM - DD HH:MM:SS',新系统订单表orders_b的下单时间字段order_time_b是DATETIME类型。要将数据库A中的订单数据迁移到数据库B中,并保证order_time_b字段数据准确无误。请详细阐述你会如何使用MySQL日期和时间处理函数来完成这个数据迁移任务,包括数据清洗、转换等可能涉及的步骤及相应的SQL语句。
14.3万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
  1. 数据清洗
    • 检查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}$';
    
  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_aorders_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;