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

How to convert Varchar Date Value into Date Data Type in MySQL using Case When and Str_to Date

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

以下是我的创建和插入语句,这是日期列的示例:

创建Table:

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

我希望最终输出如下所示(所有日期数据类型)

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 列。

希望获得有关如何最好地解决此问题的建议。

提前致谢。

您可以使用以下方法将字符串转换为日期。当你存储日期时,你真的应该使用 DATE-datatype。使用 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

请参阅手册中的 CASE statement and the STR_TO_DATE-函数参数(与 DATE_FORMAT 相同)。