我在从制表符分隔的值中导入它们后,对某些表进行了一系列更新。数据以我不喜欢的格式提供日期。我将它们作为字符串引入,操作它们以使它们与MySQL日期的格式相同,然后转换列。或者有时不是,但我希望它们就像MySQL日期,即使它们是字符串。
他们的开始时间为'1/4/2013 12:00:00 AM'或'11 / 4/2012 2:37:45 PM'。
我将这些变成'2013-01-04'(通常,即使原始模式明确指定日期时也存在时间)和'2012-11-04 14:37:45'。
我正在使用rlike。这不使用索引?哇。太糟糕了。
但是,对于每一列,我必须使用4个更新来处理不同的情况('1/7','2/13','11/2','12/24')。如果我使用like来做这些,那么每列可能需要16个不同的更新....
而且,如果我看到它正确,我甚至无法从rlike表达式中获取位置参数,是吗?你知道,括在括号中的表达式部分变为$ 1或$ 2 ....
因此,似乎用perl预处理tsv文件会更快。真?哇。再次,这很糟糕。
还有其他建议吗?每次我需要提取数据时,我都不能花3个小时。
答案 0 :(得分:1)
回想一下Jamie Zawinski的1997年经典名言:
您是否尝试过使用STR_TO_DATE()?这正是将非标准日期/时间字符串解析为规范日期时间值。
如果尝试使用STR_TO_DATE()进行解析并且字符串与预期格式不匹配,则该函数返回NULL。
因此,您可以尝试以不同的格式进行解析,并返回第一个给出非null结果的格式。
UPDATE mytable
SET datecolumn = COALESCE(
STR_TO_DATE(stringcolumn, '%m/%d'),
STR_TO_DATE(stringcolumn, '%d/%m/%Y'),
...etc.
);
我不知道你的不同情况是什么。可能会也可能不会一次性涵盖所有案件。
另一种选择就像你说的那样,在将原始数据加载到MySQL之前用Perl预处理原始数据。但即使这样,也不要使用正则表达式,而是使用Date::Parse。