Mysql 将格式不同的字符串转换为日期

Mysql 将格式不同的字符串转换为日期,mysql,sql,date-conversion,Mysql,Sql,Date Conversion,我有一个带有字符串列(varchar(200))的表,其中包含不同格式的日期。比如说 may 24 1983 12:00AM 1981-01-13 00:00:00 1979-01-13 00:00:00:123 我想将此列转换为日期以提取年份。我怎么办?我用stru约会,但效果不好。我必须为每种不同的格式使用子字符串 MySQL 5.0.95版我会尝试使用服务器端语言,比如PHP,并使用strotime生成一个漂亮的日期 否则,我看到的唯一其他选项是开始编写案例s以读取可能的格式,并使用DA

我有一个带有字符串列(varchar(200))的表,其中包含不同格式的日期。比如说

may 24 1983 12:00AM
1981-01-13 00:00:00
1979-01-13 00:00:00:123
我想将此列转换为日期以提取年份。我怎么办?我用stru约会,但效果不好。我必须为每种不同的格式使用子字符串


MySQL 5.0.95版

我会尝试使用服务器端语言,比如PHP,并使用
strotime
生成一个漂亮的日期

否则,我看到的唯一其他选项是开始编写
案例
s以读取可能的格式,并使用
DATE\u格式
输出。也许是这样的:

伪代码(适用于1983年5月24日凌晨12:00的情况)


您还可以尝试使用
REGEXP
来进行模式匹配。

有一个技巧可以检测数据集上的有效日期。您可以使用它来确定
STR\u to\u 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
为您期望的每个人设置一种格式。疯狂地测试

祝你好运


(哦,恭喜你尝试清理一个坏模式!)

坏模式。糟糕。我将首先修复数据(将其转换为一致的可转换文本值),然后更新模式以使用real-datetime列(并让该值自动转换或执行转换所需的任何其他操作)。然后使用标准数据函数提取日期。这个问题的存在只是因为数据库模式被破坏了。我们不是在讨论数据库模式,我同意你的观点,它真的很糟糕。主要的问题是我有这个表,我想做这个清理工作,我必须把这些字符串转换成datetime。你能帮忙吗?(带着建设性的评论)你想知道进一步的复杂情况吗?月份名称的缩写不是英语!你建议我清理一下缩略语(例如意大利语-英语gen=jan)?如果缩略语是在一堆不同的语言中,那么将它们标准化将有帮助。如果它们在一个(比如说,意大利语)中,我想知道在mysql中更改默认语言是否可以覆盖它。
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