You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动