SQL中从短日期格式提取数字日期值的实现方法
将短日期格式(如16-Mar-20)转换为数字日期的SQL方案
我明白你现在需要把这类带月份英文缩写的短日期,转换成纯数字格式的日期值(比如把16-Mar-20转成20200316这类数字),甚至可以通过拆分日、月、年分别计算的方式实现。下面根据不同SQL数据库,给你几种实用的方案:
一、直接转换为数字日期(推荐)
这种方法先把字符串格式的日期转换为数据库原生的日期类型,再格式化为YYYYMMDD的字符串,最后转为数字类型。
MySQL 示例
SELECT CAST(DATE_FORMAT(STR_TO_DATE(`Start Date`, '%d-%b-%y'), '%Y%m%d') AS UNSIGNED) AS Date_Numeric FROM your_table;
- 步骤解析:
STR_TO_DATE(Start Date, '%d-%b-%y'):将16-Mar-20这类字符串转换为MySQL的DATE类型DATE_FORMAT(..., '%Y%m%d'):把日期格式化为20200316这样的字符串CAST(AS UNSIGNED):将字符串转换为无符号整数,得到最终的数字日期
SQL Server 示例
SELECT CAST(CONVERT(VARCHAR, CONVERT(DATE, [Start Date], 6), 112) AS INT) AS Date_Numeric FROM your_table;
- 步骤解析:
CONVERT(DATE, [Start Date], 6):格式代码6对应dd-Mon-yy,将字符串转为日期类型CONVERT(VARCHAR, ..., 112):格式代码112对应YYYYMMDD,得到数字格式的字符串CAST(AS INT):转为整数类型的数字日期
二、拆分日、月、年分别计算(符合你的思路)
如果你希望通过拆分日期各部分再计算的方式实现,也可以这样做:
MySQL 示例
SELECT EXTRACT(YEAR FROM STR_TO_DATE(`Start Date`, '%d-%b-%y')) * 10000 + EXTRACT(MONTH FROM STR_TO_DATE(`Start Date`, '%d-%b-%y')) * 100 + EXTRACT(DAY FROM STR_TO_DATE(`Start Date`, '%d-%b-%y')) AS Date_Numeric FROM your_table;
- 逻辑:年乘以10000(让年份占据前四位),月乘以100(占据中间两位),加上日期(最后两位),最终得到
2020*10000 + 3*100 +16 = 20200316
SQL Server 示例
SELECT DATEPART(YEAR, CONVERT(DATE, [Start Date], 6)) * 10000 + DATEPART(MONTH, CONVERT(DATE, [Start Date], 6)) * 100 + DATEPART(DAY, CONVERT(DATE, [Start Date], 6)) AS Date_Numeric FROM your_table;
关于你之前尝试的语句说明
你之前用的FROM_UNIXTIME(Start Date, 'dd-MMM-yy')是反方向的操作:它是把Unix时间戳(数字)转换为日期字符串,而不是把日期字符串转成数字。这就是为什么它没达到你想要的数字日期效果,需要先把字符串转成日期/时间戳,再进行后续转换。
内容的提问来源于stack exchange,提问作者Shivam Sahil




