前言
最近开发那边反馈了一个问题, select to_date(sysdate,‘yyyy/mm/dd hh24:mi:ss’) from dual;时候结果显示是0007/1/22
提示:以下是本篇文章正文内容,下面案例可供参考
一、问题分析
因为to_date是类型的转化无法进行格式转换,应先加入to_char进行格式转换,正确的写法应该是:
SQL> select to_date(to_char(sysdate,'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') from dual;
二、尝试解决方案
但开发上程序很多地方都是这样写的,更改工作量大,只能想其他办法,那就是修改nls_date_format参数:这里涉及到:NLS_DATABASE_PARAMETERS、NLS_SESSION_PARAMETERS、NLS_INSTANCE_PARAMETERS
对于system尝试修改:
SQL> alter system set nls_database_parameters='yyyy/mm/dd hh24:mi:ss' scope=spfile sid='*';
重启库后发现参数已修改但未到达预期效果。
对于instance尝试修改:
添加环境变量但是还未到达预期效果。
对于session尝试修改:


SQL> alter session set nls_database_parameters='yyyy/mm/dd hh24:mi:ss';
这里修改了后达到了预期效果,但只是对当前会话生效,新建的一个会话完全没有效果。
只能放大招了,加上一个触发器来变更会话。
实际生效的解决方案:
在system下创建一个触发器:
CREATE OR REPLACE TRIGGER LOGINTRG
AFTER LOGON ON DATABASE
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''yyyy/mm/dd hh24:mi:ss''';
END LOGINTRG;
/
代码很好懂,连接session后去执行 ALTER SESSION 来改变NLS_DATE_FORMAT 值。
总结
所以说这个to_Date在使用中要注意它的格式哦,to_Date不具备转换格式的功能!尽早修改代码!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




