我正在导入一些旧数据,因此我将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
答案 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;
如果某些数据可以为空字符串,必须将其视为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;
请参阅更新后的问题
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;
答案 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`;