是否可以更改MySQL列中日期值的格式?

是否可以更改MySQL列中日期值的格式?,mysql,date,Mysql,Date,今天使用的数据库是5年前建立的,一些日期字段/列中的条目采用欧洲字符串格式,即2013年5月29日,而不是2013年5月29日,最后一个有点标准 遗憾的是今天的设置,但它是这样做多年前由于缺乏知识的主题 是否可以重写这些列值? 或者作为第二种解决方案,可能是从旧列中获取数据,并在执行转换时将其写入新列 每一行都有一个唯一的ID-testid 数据库如下所示: testid date1 date2 date3 ---------------

今天使用的数据库是5年前建立的,一些日期字段/列中的条目采用欧洲字符串格式,即2013年5月29日,而不是2013年5月29日,最后一个有点标准

遗憾的是今天的设置,但它是这样做多年前由于缺乏知识的主题

是否可以重写这些列值? 或者作为第二种解决方案,可能是从旧列中获取数据,并在执行转换时将其写入新列

每一行都有一个唯一的ID-
testid

数据库如下所示:

    testid        date1        date2        date3
    --------------------------------------------------
    001           2012-01-01   02.01.2012   04.01.2012
    002           2012-03-03   05.03.2012   10.03.2012
date1
中,我们使用了时间戳,因此它工作正常。希望其他列的格式相同


希望比我更有经验的人能提出一些建议。

您可以更新列并使用字符串函数:

update t
    set date2 = concat_ws('-', left(date2, 4), right(date2, 2), substr(date2, 4, 2)),
        date3 = concat_ws('-', left(date3, 4), right(date3, 2), substr(date3, 4, 2));
执行此操作后,您甚至可以更改列的类型:

alter table modify date2 date;
alter table modify date3 date;
编辑:

实际格式是dd.mm.yyyy而不是mm.dd.yyyy,因此:

update t
    set date2 = concat_ws('-', left(date2, 4), substr(date2, 4, 2), right(date2, 2)),
        date3 = concat_ws('-', left(date3, 4), substr(date3, 4, 2), right(date3, 2));

您可以更新列并使用字符串函数:

update t
    set date2 = concat_ws('-', left(date2, 4), right(date2, 2), substr(date2, 4, 2)),
        date3 = concat_ws('-', left(date3, 4), right(date3, 2), substr(date3, 4, 2));
执行此操作后,您甚至可以更改列的类型:

alter table modify date2 date;
alter table modify date3 date;
编辑:

实际格式是dd.mm.yyyy而不是mm.dd.yyyy,因此:

update t
    set date2 = concat_ws('-', left(date2, 4), substr(date2, 4, 2), right(date2, 2)),
        date3 = concat_ws('-', left(date3, 4), substr(date3, 4, 2), right(date3, 2));
看一看

因此,首先我建议将字符串转换为适当的格式(但保留为字符串),如下所示:

我不确定是否真的需要
转换(…as char(10))
。然后,在第二步中更改列的数据类型:

alter table mytable modify date2 date;
alter table mytable modify date3 date;                      
看一看

因此,首先我建议将字符串转换为适当的格式(但保留为字符串),如下所示:

我不确定是否真的需要
转换(…as char(10))
。然后,在第二步中更改列的数据类型:

alter table mytable modify date2 date;
alter table mytable modify date3 date;                      

你的专栏是什么类型的?尤其是
date2
date3
?串?哦,我明白了。它是
date/char(10)/char(10)
或类似的东西。抱歉,太吵了。请从TableName中选择日期格式(列名称,%d/%m/%Y')列的类型是什么?尤其是
date2
date3
?串?哦,我明白了。它是
date/char(10)/char(10)
或类似的东西。很抱歉造成噪音。请从TableName中选择日期格式(列名称“%d/%m/%Y”),但它是date2和date3,而不是date1和date2。另外,为了确保这一点,我会添加一个WHERE date2(或者甚至是一个regexp?),在更新之后,我会验证没有元组留下无效的日期。字符串字段的一个问题是它可以轻松地接受32.15.2015,我们不知道前端进行了哪些检查。@Iserni,关于列名,true-edited。关于错误处理,你是对的,但我不认为答案是为了解决手头的整个工程问题,只要给出基本答案“我如何做X”。我假设海报会自己处理错误和异常,而不是期望答案提供所有这些。另外,在您提到的案例中生成“0000-00-00”可能是正确的做法……完全同意。。。几乎全部。你关于0000-00-00的观点被很好地理解了。此外,我同意,我们不能期望提供全面的答案和每一个细微差别的细节;反常的是,我们越是努力,我们就越会因为那些我们没有解决的问题而承担更多的任务。我仍然会至少提到一两个最明显的下一步或绊脚石(在这一点上,我不妨坦白说,我所说的“最明显的”是指“发生在我身上不止一次”)。我测试了@e.dan的建议,它非常有效!错误处理目前有点超出我的能力范围,但在更新后快速浏览数据库可以确认所有数据都已转换为我所需的格式。非常感谢。也许我有点快,一些领域出现了1970-01-01。可能是没有数据的字段。在进行转换时,有没有关于如何跳过这些空白字段的建议?除了date2和date3,而不是date1和date2。另外,为了确保这一点,我会添加一个WHERE date2(或者甚至是一个regexp?),在更新之后,我会验证没有元组留下无效的日期。字符串字段的一个问题是它可以轻松地接受32.15.2015,我们不知道前端进行了哪些检查。@Iserni,关于列名,true-edited。关于错误处理,你是对的,但我不认为答案是为了解决手头的整个工程问题,只要给出基本答案“我如何做X”。我假设海报会自己处理错误和异常,而不是期望答案提供所有这些。另外,在您提到的案例中生成“0000-00-00”可能是正确的做法……完全同意。。。几乎全部。你关于0000-00-00的观点被很好地理解了。此外,我同意,我们不能期望提供全面的答案和每一个细微差别的细节;反常的是,我们越是努力,我们就越会因为那些我们没有解决的问题而承担更多的任务。我仍然会至少提到一两个最明显的下一步或绊脚石(在这一点上,我不妨坦白说,我所说的“最明显的”是指“发生在我身上不止一次”)。我测试了@e.dan的建议,它非常有效!错误处理目前有点超出我的能力范围,但在更新后快速浏览数据库可以确认所有数据都已转换为我所需的格式。非常感谢。也许我有点快,一些领域出现了1970-01-01。可能是没有数据的字段。在进行转换时,有没有关于如何跳过这些空白字段的建议?嗨,戈登,谢谢你的贡献!我测试了你的建议,但在专栏里有一些奇怪的数字。不是MySQL专家,所以不知道为什么。后来我测试了@e.dan的建议,结果成功了,所以我选择了这个。再次感谢你@克尔维克。确实如此