如何在 MySQL 中使用 Case When 和 Str_to Date 将 Varchar 日期值转换为日期数据类型
Posted
技术标签:
【中文标题】如何在 MySQL 中使用 Case When 和 Str_to Date 将 Varchar 日期值转换为日期数据类型【英文标题】:How to convert Varchar Date Value into Date Data Type in MySQL using Case When and Str_to Date 【发布时间】:2020-05-22 12:24:50 【问题描述】:我有一个表中的日期列表,该表当前将该列保存为 Varchar 数据类型。我要做的是清理这个表,第一步是将此列转换为日期数据类型并将值转换为我必须一致的值。
以下是我的创建和插入语句,这是日期列的示例:
创建表:
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');
我希望最终输出如下所示(所有 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 列。
希望得到一些关于如何最好地解决这个问题的建议。
提前致谢。
【问题讨论】:
给自己一个痛苦的世界,并使用日期数据类型存储日期 @Strawberry 这就是 OP 想要做的事情! 感谢大家的回复。不幸的是,使用 Varchar 的原因是因为该列与 csv 文件的差异,因此现在要进行清理过程。 【参考方案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
语句和STR_TO_DATE
函数参数(与DATE_FORMAT
相同)。
【讨论】:
谢谢 slaakso,这成功了,有没有办法在同一列本身上做,还是我必须在新列上做?最后,是否有一个链接或其他内容只是为了理解 '%d-%b-%y' 而不是我想要了解代码中发生的事情的复制/粘贴工作。 您最好添加一个date
列,使用update
-statement 将字符串转换为日期,然后删除varchar
-列。请参阅手册页的链接。
只是出于好奇,您将如何处理没有“day”元素的值,例如“2019 年 1 月”,我猜您将不得不完全更改 case 语句,因为不会'不是分隔值“/”或“-”吗?顺便说一句,我的问题已经得到解答,这只是为了了解日期值的更多元素。
@MichaelOwen 日期包含日、月和年部分。如果您的数据只有月份和年份,则您需要确定该字符串在该月代表哪一天(第一天/最后一天/其他一天)。如果您的数据在varchar
中有更多任意日期表示法,您可能需要考虑创建一个解析数据并生成日期的函数。与简单的CASE
-statement 相比,使用函数可以更灵活地解析数据。以上是关于如何在 MySQL 中使用 Case When 和 Str_to Date 将 Varchar 日期值转换为日期数据类型的主要内容,如果未能解决你的问题,请参考以下文章
在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END