将旧数据转换为MySQL-如何进行选择以合并这些日期,开始日期和结束日期字段?

时间:2020-08-21 12:02:21

标签: mysql

我正在导入一些旧数据,因此我将csv文件作为VARCHAR字段导入,因为将所有表分别整理为适当的列类型是不可行的。

我需要从数据中提取开始日期和结束日期,看起来(非常旧的)系统使用日期/时间格式作为日期,以及使用日期/时间格式和默认日期作为开始时间和结束时间。我想选择并将其转换为两个字段,例如,starts_at和endss_at。

这是旧的数据格式。所有列都是VARCHAR。

id, appointmentdate, starttime endtime
1, 21/1/2016 00:00:00, 30/12/1899 09:00:00, 30/12/1899 17:00:00

此刻我有个日期,如果我可以在这次选择中做到这一点,那会很好,但是我不反对以后再运行更新。注意,我将原始ID作为og_id存储,以供参考,并保持打开状态,以便在IFNULL函数中在空实例中执行操作。

INSERT INTO `my_db`.`my_table`
SELECT
    NULL, -- id
    IFNULL(STR_TO_DATE(IF(`a`.`appointmentdate` = '', NULL, `a`.`appointmentdate`),'%d/%m/%Y %H:%i:%S'), NULL), -- starts_at
    IFNULL(STR_TO_DATE(IF(`a`.`appointmentdate` = '', NULL, `a`.`appointmentdate`),'%d/%m/%Y %H:%i:%S'), NULL), -- ends_at
    `a`.`id` -- og_id
FROM
`old_db`.`old_table` `a`;

我希望新表中的结果行(正确键入INT,DATETIME,DATETIME,INT如下)。

id, starts_at, ends_at, og_id
1, 2016-01-21 09:00:00, 2016-01-21 17:00:00, 1

3 个答案:

答案 0 :(得分:1)

例如,使用substring_index和concat来获取开盘时间

select str_to_date(concat(substring_index(`a`.`appointmentdate`,' ',1),'09:00:00'),'%d/%m/%Y %H:%i:%S'),
       str_to_date(concat(substring_index(`a`.`appointmentdate`,' ',1),'17:00:00'),'%d/%m/%Y %H:%i:%S')
from `old_db`.`old_table` `a`;

或者如果您想从默认值中选择时间

select 
       str_to_date(concat(substring_index(`a`.`appointmentdate`,' ',1),time(str_to_date(starttime,'%d/%m/%Y %H:%i:%S'))),'%d/%m/%Y %H:%i:%S') startdt,
       str_to_date(concat(substring_index(`a`.`appointmentdate`,' ',1),time(str_to_date(endtime,'%d/%m/%Y %H:%i:%S'))),'%d/%m/%Y %H:%i:%S') enddt
from `old_db`.`old_table` `a`;

答案 1 :(得分:0)

INSERT INTO new_data (id, appointmentdate, starttime, endtime)
SELECT id,
       STR_TO_DATE(appointmentdate, '%d/%m/%Y %H:%i:%S'),
       STR_TO_DATE(starttime, '%d/%m/%Y %H:%i:%S'),
       STR_TO_DATE(endtime, '%d/%m/%Y %H:%i:%S')
FROM old_data;

fiddle

如果某些数据可以为空字符串,必须将其视为NULL,则可以使用

INSERT INTO new_data (id, appointmentdate, starttime, endtime)
SELECT id,
       STR_TO_DATE(NULLIF(appointmentdate, ''), '%d/%m/%Y %H:%i:%S'),
       STR_TO_DATE(NULLIF(starttime, ''), '%d/%m/%Y %H:%i:%S'),
       STR_TO_DATE(NULLIF(endtime, ''), '%d/%m/%Y %H:%i:%S')
FROM old_data;

fiddle


请参阅更新后的问题

INSERT INTO new_data (id, appointmentdate, starttime, endtime, old_id)
SELECT NULL,
       STR_TO_DATE(NULLIF(appointmentdate, ''), '%d/%m/%Y %H:%i:%S'),
       STR_TO_DATE(NULLIF(starttime, ''), '%d/%m/%Y %H:%i:%S'),
       STR_TO_DATE(NULLIF(endtime, ''), '%d/%m/%Y %H:%i:%S'),
       id
FROM old_data;

fiddle

答案 2 :(得分:0)

使用@ P.Salmon中的概念,我已经做到了。

INSERT INTO `my_db`.`my_table`
SELECT
    NULL, -- id
    CONCAT_WS(' ', DATE(STR_TO_DATE(IF(`a`.`appointmentdate` = '', NULL, `a`.`appointmentdate`),'%d/%m/%Y %H:%i:%S')), TIME(STR_TO_DATE(IF(`a`.`starttime` = '', NULL, `a`.`starttime`),'%d/%m/%Y %H:%i:%S'))) as starts_at, -- starts_at
    CONCAT_WS(' ', DATE(STR_TO_DATE(IF(`a`.`appointmentdate` = '', NULL, `a`.`appointmentdate`),'%d/%m/%Y %H:%i:%S')), TIME(STR_TO_DATE(IF(`a`.`endtime` = '', NULL, `a`.`endtime`),'%d/%m/%Y %H:%i:%S'))) as ends_at -- ends_at
    `a`.`id` -- og_id
FROM
`old_db`.`old_table` `a`;
相关问题