Oracle SQL中TRUNC函数处理日期年份显示为0022而非2022的解决方法
解决SQL日期截断后年份显示为0022的问题
问题原因
你的代码存在两个可能的错误点:
- 如果
actual_comp_date本身是日期/时间类型(比如Oracle的DATE、TIMESTAMP),你多余地使用了TO_DATE转换——这会先把日期转成字符串(依赖会话的NLS_DATE_FORMAT设置),再按'DD/MM/YYYY'格式转回日期。若默认格式采用两位年份(如DD/MM/RR),就会把2022解析成0022。 - 如果
actual_comp_date是字符串类型,TO_DATE的格式串'DD/MM/YYYY'和实际字符串'01/04/2022 23:23:23'不匹配,虽然Oracle会忽略时间部分,但年份解析会因格式不严谨出现异常,导致两位年份的问题。
解决方案
分两种场景处理:
1. 当actual_comp_date是日期/时间类型时
直接对字段用TRUNC截断时间,再转成字符串即可,无需多余的TO_DATE转换:
select job.job_number, job.actual_comp_date, TO_CHAR(TRUNC(job.actual_comp_date), 'DD/MM/YYYY') as Truncated_Date from job
TRUNC会直接将日期的时间部分清零(变为当天00:00:00),再通过TO_CHAR指定'DD/MM/YYYY'格式输出4位年份。
2. 当actual_comp_date是字符串类型时
先按完整的字符串格式转成日期,再截断时间,最后转成目标格式:
select job.job_number, job.actual_comp_date, TO_CHAR(TRUNC(TO_DATE(job.actual_comp_date, 'DD/MM/YYYY HH24:MI:SS')), 'DD/MM/YYYY') as Truncated_Date from job
这里TO_DATE的格式串'DD/MM/YYYY HH24:MI:SS'完全匹配你的字符串内容(包含日期和时间),确保年份被正确解析为4位,后续的TRUNC和TO_CHAR步骤与第一种场景一致。
验证结果
修改后查询结果会和预期一致:
job number actual_comp_date truncated_date 1234 01/04/2022 23:23:23 01/04/2022 1234 01/04/2022 23:23:23 01/04/2022 3837 23/04/2022 13:23:23 23/04/2022
内容的提问来源于stack exchange,提问作者Rob Morris
相关产品推荐
相关产品推荐

