【问题标题】:Converting all data in a Varchar column to a date format将 Varchar 列中的所有数据转换为日期格式
【发布时间】:2021-08-09 13:24:28
【问题描述】:

我正在处理一个包含“到期日期”列的表,它是一个 varchar,所有数据的格式都为 DD/MM/YYYY。

表的创建者为此到期日期列使用了错误的类型,现在客户端需要过滤并显示当前日期之前和之后的所有记录作为时间。这意味着需要将类型更改为日期或日期时间类型才能使用 CURDATE() 函数。

但是,值的当前格式不满足并且不允许类型更改,除非格式更改为 YYYY-MM-DD(或类似格式)。

有没有办法批量格式化这一列和这一列中的值,因为有数千个条目,并且逐个格式化会非常耗时。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql date datetime phpmyadmin varchar


【解决方案1】:

您需要的是对该列的更新,但在此之前我建议您检查结果是否是您想要的。

select replace(expiry_date, '/', '-') new_expiry_date
  from table_name

如果这返回了您想要的结果,您可以运行以下更新:

update table_name
   set expiry_date = replace(expiry_date, '/', '-')

当然,您需要将expiry_datetable_name 替换为您的列和表的名称。

【讨论】:

  • 感谢您的回复 Mucio。我曾考虑过这一点,并通过手动编辑第一个条目来尝试这种方法,但是,格式仍然要求年份后接月份和日期。目前是什么 = DD-MM-YYYY 满足日期类型格式需要什么 = YYYY-MM-DD
  • 我理解答案,但仅用连字符替换斜线不会使该列成为日期。这是如何获得支持的?
  • 是的,对不起,我错过了,我没有看到他们从那天开始:)
【解决方案2】:

假设您使用的是 MySQL。

也许最简单的方法是添加一个生成的日期列:

alter table t add column expiry_date_date as
    (str_to_date(expiry_date, '%d/%m/%Y'));

您也可以修复数据:

update t
    set expiry_date = str_to_date(expiry_date, '%d/%m/%Y');

这会将str_to_date() 的结果隐式转换为日期,该日期将采用 YYYY-MM-DD 格式。

更重要的是,您可以这样做:

alter table t modify column expiry_date date;

Here 是一个 dbfiddle。

你可以在其他数据库中做类似的操作,但具体代码有点不同。

【讨论】:

  • 谢谢戈登,我赞成之前的答案,因为它与我最初的想法一致,但在你的解决方案之后,我明白为什么我不应该这样做,因为它不适合更改日期。
猜你喜欢
  • 2013-08-13
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多