【问题标题】:SQL(phpMyAdmin): Change Column Format of Date With CommandSQL(phpMyAdmin):使用命令更改日期的列格式
【发布时间】:2021-07-09 09:05:46
【问题描述】:

我有一个名为“expdate”的列,类型为“varchar”,其值如下:

2021-02-27
28-02-2023
29/02/2024
.
.
.

现在我想将格式 %d-%m-%Y 等所有日期值更改为 %Y-%m-%d 并保存到新列并使用日期类型:

UPDATE `Users`
    SET `fixed_expdate` = STR_TO_DATE(REPLACE(`expdate`,"/",'-'), "%d-%m-%Y")
 where `expdate` != '0000-00-00'

但是 sql 命令显示错误如下:

SQL查询: UPDATE `Users` SET `fixed_expdate` = STR_TO_DATE(REPLACE(`expdate`,"/",'-'), "%d-%m-%Y") where `expdate` != '0000-00-00' MySQL 说:文档 #1411 - 不正确的日期时间值:函数 str_to_date 的“2021-02-27”

我需要sql命令,你的解决方案是什么?

【问题讨论】:

  • 您必须添加功能来检测三种典型格式:
  • 欧洲是 'dd[./-]mm[./-]yyyy'。美国是'mm/dd/yyyy'。 ISO 是'yyyy-mm-dd'。只有在其他格式的月份数字无效的情况下,才能将美国与欧洲区分开来。 ISO 格式很简单。一旦您可以从欧洲检测到美国人,您就可以使用不同的 STR_TO_DATE() 调用来创建您的日期

标签: mysql sql phpmyadmin


【解决方案1】:

您必须对每种单独的源数据格式使用不同的转换表达式。并且您必须检查是否只有与当前查询中使用的模式匹配的值才会包含在转换中。

这可以使用许多单独的查询来执行,每个查询都会转换一种现有的源格式。

-- convert the dates which have correct format
UPDATE `Users` 
SET `fixed_expdate` = `expdate`
WHERE `expdate` REGEXP '\d\d\d\d-\d\d-\d\d';

-- convert dated which looks like 28-02-2023
UPDATE `Users` 
SET `fixed_expdate` = STR_TO_DATE(`expdate`, "%d-%m-%Y") 
WHERE `expdate` REGEXP '\d\d-\d\d-\d\d\d\d';

-- convert dated which looks like 29/02/2024
UPDATE `Users` 
SET `fixed_expdate` = STR_TO_DATE(`expdate`, "%d\/%m\/%Y") 
WHERE `expdate` REGEXP '\d\d\/\d\d\/\d\d\d\d';

-- and so on

每次单独转换后(或多次转换后),您可能会查看未转换的行

SELECT `expdate`
FROM `Users`
WHERE `fixed_expdate` IS NULL
LIMIT XXX

并为尚未使用的模式构建下一个转换表达式 - 直到所有值都成功转换。


MySQL 说:文档 #1411 - 不正确的日期时间值:函数 str_to_date 的“2021-02-27”

这是由于 2 种不同的格式,它们在日期和月份拥有不同(它们被交换) - 它们不容易区分。如果这两种格式都存在于数据中,您必须使用额外的检查。如果两种格式都可能(例如,当值为 '01/02/2021' 时),您无法区分必须应用哪种格式。


更新(从评论中复制)

您的正则表达式应该可能在字符串的开头和结尾都有锚点('^' 和 '$')。 – Gordon Linoff

【讨论】:

  • 您的正则表达式应该可能在字符串的开头和结尾都有锚点('^''$')。
  • @GordonLinoff 是的,这可能是安全的。
猜你喜欢
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2022-07-08
  • 2016-06-08
相关资源
最近更新 更多