如何将单个日期时间列拆分为日、月、年三个独立列
实现方法
你的joining_date是DD-MON-YY带时间后缀的格式,别直接硬切字符串,容错率太低,用数据库自带的日期函数提取最稳,不同数据库写法如下,对着自己用的库抄就行:
- Oracle(和你示例的日期格式默认适配度最高)
如果字段本身是DATE类型,直接取就行:
SELECT TO_CHAR(joining_date, 'DD') AS joining_date, TO_CHAR(joining_date, 'MON') AS joining_month, TO_CHAR(joining_date, 'YY') AS joining_year FROM 你的表名;
如果字段存的是字符串类型,先转成日期再取,避免格式解析错误:
SELECT TO_CHAR(TO_DATE(joining_date, 'DD-MON-YY HH.MI.SSAM'), 'DD') AS joining_date, TO_CHAR(TO_DATE(joining_date, 'DD-MON-YY HH.MI.SSAM'), 'MON') AS joining_month, TO_CHAR(TO_DATE(joining_date, 'DD-MON-YY HH.MI.SSAM'), 'YY') AS joining_year FROM 你的表名;
跑出来的结果和你要的效果完全一致:日返回两位数字、月份返回三位大写英文缩写、年份返回两位短年份。
- MySQL
字段为DATETIME类型时写法:
SELECT DATE_FORMAT(joining_date, '%d') AS joining_date, UPPER(DATE_FORMAT(joining_date, '%b')) AS joining_month, DATE_FORMAT(joining_date, '%y') AS joining_year FROM 你的表名;
如果是字符串存储,套一层STR_TO_DATE(joining_date, '%d-%b-%y %h.%i.%s%p')转成时间类型再提取即可。
- PostgreSQL
SELECT TO_CHAR(joining_date::timestamp, 'DD') AS joining_date, TO_CHAR(joining_date::timestamp, 'MON') AS joining_month, TO_CHAR(joining_date::timestamp, 'YY') AS joining_year FROM 你的表名;
踩坑提醒:别用字符串截取位置的方式拆分,碰到单数字日期/月份长度变化的场景(比如1月3号存成
3-JAN-22而不是03-JAN-22),截取结果会直接错位,用官方日期格式化函数不存在这个问题。
内容的提问来源于stack exchange,提问作者user19541968
相关产品推荐
相关产品推荐

