如何在MySQL中使用Case When和Str_to Date将Varchar日期值转换为日期数据类型

如何在MySQL中使用Case When和Str_to Date将Varchar日期值转换为日期数据类型,mysql,substring,str-to-date,Mysql,Substring,Str To Date,我在一个表中有一个日期列表,该表当前将该列作为Varchar数据类型保存。我要做的是清理这个表,第一步是将这个列转换成日期数据类型,并转换我必须一致的值 以下是我的create和insert语句,这是Date列的示例: 创建表: CREATE TABLE “BU_TABLE_DATES" ( "END_DATE" VARCHAR2(255 BYTE) ); 插入语句: INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES

我在一个表中有一个日期列表,该表当前将该列作为Varchar数据类型保存。我要做的是清理这个表,第一步是将这个列转换成日期数据类型,并转换我必须一致的值

以下是我的create和insert语句,这是Date列的示例:

创建表:

CREATE TABLE “BU_TABLE_DATES" 
   (           "END_DATE" VARCHAR2(255 BYTE)
   );
插入语句:

INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('01/01/2018');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-18');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-19');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-19');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13-Jan-20');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13/01/2018');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13/01/2019');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('13/01/2020');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('17/07/2017');
INSERT INTO "BU_TABLE_DATES" (END_DATE) VALUES ('17/07/2019');
我希望最终的输出是如下的all Date数据类型

End_Date
01/01/2018
13/01/2018
13/01/2019
13/01/2019
13/01/2020
13/01/2018
13/01/2019
13/01/2020
13/01/2020
17/07/2017
17/07/2019
目前,我已经成功地使用case语句和str_to_date编写了以下代码,这有助于转换月份仅为2个字符的值,以及如何使用格式在末尾显示年份,即使代码是这样编写的

我的问题

SELECT
    End_Date,
    CASE End_Date
        WHEN substring(End_Date,2,1) = '-' THEN STR_TO_DATE (End_Date,'%d-%m-%Y')
        WHEN substring(End_Date,2,1) = '/' THEN STR_TO_DATE (End_Date,'%d/%m/%Y')
    ELSE STR_TO_DATE (End_Date,'%d/%m/%Y') END as End_Date_New
FROM
    BU_TABLE_DATES
;
输出

End_Date    End_Date_New
01/01/2018  2018-01-01
13-Jan-18   (null)
13-Jan-19   (null)
13-Jan-19   (null)
13-Jan-20   (null)
13/01/2018  2018-01-13
13/01/2019  2019-01-13
13/01/2020  2020-01-13
13/01/2020  2020-01-13
17/07/2017  2017-07-17
17/07/2019  2019-07-17
最后,在代码中,我创建了一个新列,但我只想更改现有列的数据类型,但目前找到了一种创建新列的方法,然后认为最好删除旧列,但理想情况下,我希望这能在1列上工作

我很想得到一些关于如何最好地解决这个问题的建议


提前感谢。

您可以使用以下命令将字符串转换为日期。存储日期时,确实应该使用日期数据类型。使用VARCHAR表示日期只会给你带来麻烦

SELECT
  End_Date,
  CASE substring(End_Date,3,1)
    WHEN '-' THEN STR_TO_DATE(End_Date,'%d-%b-%y')
    WHEN '/' THEN STR_TO_DATE(End_Date,'%d/%m/%Y')
  END as End_Date_New
FROM 
  BU_TABLE_DATES

请参阅手册中与DATE_格式相同的语句和-function参数。

让自己免于痛苦,并使用日期数据存储日期type@Strawberry这就是OP想要做的!谢谢你们的回复。不幸的是,使用Varchar的原因是因为此列与csv文件不一致,因此现在需要执行清理过程。感谢slaakso,这就成功了,是要在同一列上执行此操作,还是必须在新列上执行此操作?最后,有一个链接或其他东西只是为了理解“%d-%b-%y”,而不是我这边的复制/粘贴作业,因为我想了解代码中发生了什么。您最好添加一个日期列,使用update语句将字符串转换为日期,然后删除varchar列。请参阅手册页面的链接。出于好奇,您将如何处理没有day元素的值,例如2019年1月,我猜您必须完全更改case语句,因为不会有分隔符值/或-以及-对吗?顺便说一句,我的问题已经得到了回答,这只是为了了解日期值的更多元素。@MichaelOwen日期包括日期、月份和年份部分。如果您的数据只有月份和年份,则需要确定该字符串代表该月份的第一天/最后一天/其他某一天。如果您的数据在VARCHAR中具有更为任意的日期标记,那么您可能需要考虑创建一个解析数据并生成日期的函数。与简单的CASE语句相比,使用函数可以更灵活地解析数据。