【问题标题】:Is it possible to change format of date values in a MySQL column?是否可以更改 MySQL 列中日期值的格式?
【发布时间】:2016-02-22 04:30:41
【问题描述】:

今天使用的数据库是 5 年前创建的,某些日期字段/列中的条目采用欧洲字符串格式,显示 29.05.2013 而不是 2013-05-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 中,我们使用的是时间戳,所以它工作正常。真的希望其他列具有相同的格式。

希望比我更懂的人给点建议。

【问题讨论】:

  • 您的列有哪些类型?特别是。 date2date3?字符串?我懂了。这是date/char(10)/char(10) 或某事。相似的。抱歉打扰了。
  • 从表名中选择 DATE_FORMAT(column_name, '%d/%m/%Y')

标签: mysql date


【解决方案1】:

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

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));

【讨论】:

  • 嗨,戈登,感谢您的贡献!我测试了你的建议,但在列中得到了一些奇怪的数字。不是 MySQL 专家,所以不知道为什么。之后我测试了@e.dan 的建议并且成功了,所以我会选择那个。再次感谢您!
  • @ChrVik 。 . .这不起作用,因为我认为格式是 mm.dd.yyyy。
【解决方案2】:
update t set date2=str_to_date(date2, '%d.%m.%Y'), date3=str_to_date(date3,'%d.%m.%Y');
alter table t modify date2 date;
alter table t modify date3 date;

【讨论】:

  • 除了是date2和date3,不是date1和date2。另外,为了确定,我会添加一个 WHERE date2 LIKE (或者甚至可能是一个正则表达式?),并且在更新之后我会验证没有留下无效日期的元组。字符串字段的一个问题是它可以愉快地接受 32.15.2015,我们不知道前端做了什么检查。
  • @Iserni,关于列名,真实 - 已编辑。关于错误处理,你是对的,但我不认为 SO 答案是为了解决手头的整个工程问题,只是给出“我如何做 X”的基本答案。我会假设发布者会自己处理错误和异常,而不是期望答案能提供所有这些。另外,在你提到的情况下产生“0000-00-00”可能是正确的做法......
  • 完全同意...几乎所有。您在 0000-00-00 上的观点很好。此外,我同意我们不能提供全面的答案和每个细微差别的细节;反常的是,我们尝试得越多,我们就越会为那些我们没有解决的问题承担任务。我仍然至少会提到一两个最明显的后续步骤或绊脚石(在这一点上,我不妨坦白承认,“最明显”是指“发生在我身上,不止一次").
  • 我测试了@e.dan 的建议,效果很好!错误处理目前有点遥不可及,但在更新后快速浏览一下数据库可以确认所有数据都已转换为我想要的格式。谢谢!!
  • 也许我在那里有点快,有些领域想出了 1970-01-01。可能是没有数据开始的字段。关于在进行转换时如何跳过这些空白字段的任何建议?
【解决方案3】:

看看here

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

update mytable set date2 = cast(str_to_date(date2, '%d.%m.%Y') as char(10)), 
                   date3 = cast(str_to_date(date3, '%d.%m.%Y') as char(10));

我不确定cast(... as char(10)) 是否真的有必要。然后,在第二步中更改列的数据类型:

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

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多