Oracle中VARCHAR日期转换为指定格式DATE列的技术问题
解决Oracle中VARCHAR转DATE并指定显示格式的问题
嘿,我来帮你搞定这个日期转换的问题~
首先得明确一个关键点:Oracle里的DATE类型是不存储显示格式的,它存的是一个内部的日期数值,你查询时看到的格式完全由当前会话的NLS_DATE_FORMAT参数决定。你之前的SQL做了三次转换(字符串→DATE→字符串→DATE),其实是绕了弯路,而且没抓住核心问题。
正确的处理方式分两种场景:
场景1:只是想把字符串转成DATE类型(用于插入DATE列)
只需要一次TO_DATE转换就够了,指定原字符串的格式:SELECT TO_DATE('20-OCT-2019', 'DD-MON-YYYY') FROM dual;这时候你得到的就是标准的DATE类型值,直接用它插入DATE列就行,不用管显示格式——因为DATE列存储的不是字符串,是日期本身。
场景2:想把DATE值显示成'10/20/2019'的格式
这时候需要用TO_CHAR把DATE类型转成指定格式的字符串:SELECT TO_CHAR(TO_DATE('20-OCT-2019', 'DD-MON-YYYY'), 'MM/DD/YYYY') FROM dual;执行这个语句会直接返回VARCHAR类型的
'10/20/2019',完全符合你的显示需求。
为什么你的原SQL没得到预期结果?
你之前的语句:
select to_date(to_char(to_date('20-OCT-2019','DD-MON-YYYY'),'MM/DD/YYYY'),'MM/DD/YYYY') from dual
其实是把DATE转成了'10/20/2019'字符串,又把这个字符串转回了DATE。但转回DATE后,Oracle还是会用当前会话的NLS_DATE_FORMAT来显示它,所以如果你的NLS设置不是MM/DD/YYYY,显示出来的格式就不是你想要的。这完全是多余的步骤,反而容易出问题。
如果想让整个会话里查询DATE类型都显示成MM/DD/YYYY格式,也可以直接修改会话参数:
ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY';
之后再查询DATE列或DATE类型的结果,就会自动显示成你要的格式了。
内容的提问来源于stack exchange,提问作者Shubhangi




