我有一个带有字符串列(varchar(200))的表,其中包含不同格式的日期。例如
may 24 1983 12:00AM
1981-01-13 00:00:00
1979-01-13 00:00:00:123
我想将此列转换为日期以提取年份。我该怎么办?我使用了 STR_TO_DATE 但效果不佳。我必须为每种不同的格式使用 SUBSTRING 吗?
MySQL 版本 5.0.95
我有一个带有字符串列(varchar(200))的表,其中包含不同格式的日期。例如
may 24 1983 12:00AM
1981-01-13 00:00:00
1979-01-13 00:00:00:123
我想将此列转换为日期以提取年份。我该怎么办?我使用了 STR_TO_DATE 但效果不佳。我必须为每种不同的格式使用 SUBSTRING 吗?
MySQL 版本 5.0.95
在手册页上有一个检测有效日期的技巧。您可以使用它来确定STR_TO_DATE
格式是否有效。
select foo,
case when length(date(str_to_date(foo,"%Y-%m-%d %H:%i:%S"))) is not null then str_to_date(foo,"%Y-%m-%d %H:%i:%S")
when length(date(str_to_date(foo,"%b %d %Y %h:%i%p"))) is not null then str_to_date(foo,"%b %d %Y %h:%i%p")
end as newdate
from my_table
为您期望的每个人提供一种格式。疯狂地测试。
祝你好运。
(哦,恭喜您尝试清理错误的架构!)
我会尝试使用服务器端语言(可能是 PHP)来执行此操作,并使用它strotime
来生成漂亮的日期。
否则,我看到的唯一其他选择是开始编写CASE
s 以读取可能的格式,并使用DATE_FORMAT
. 也许是这样的:
伪代码(案例 may 24 1983 12:00AM)
CASE
WHEN col (after first space is some digit)
AND (after second space is 4 digits)
AND (after third space has 'AM' or 'PM')
THEN
DATE_FORMAT(col, '%....')
您也可以尝试使用REGEXP
to 进行模式匹配。