日期:2014-05-17  浏览次数:20895 次

to_char与to_date转换问题
今天做oracle数据库更新的时候,Last_date 数据库定义类型为Date.如果传入的日期参数为null,则Last_date = oracle系统时间。格式要求 年/月/日 时:分:秒.实现过程中出现问题了。

尝试1: 

to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') -- 值为 2012/4/23 19:20:34

to_date(to_char(sysdate,'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') --输出值为 2012-4-23 

问题1: to_date之后日期格式为何不是'yyyy/mm/dd hh24:mi:ss',时分秒去哪儿了?
问题2: 输出的2012-4-23?为何不是我指定是 'yyyy/mm/dd' 格式


尝试2:

完整的sql是这样的
insert into 
  table(
  a,
  b,
  c
  )values (
  &a,
  &b,
  nvl(&c,sysdate) -- 此处nvl会截掉时分秒。在pl/sql中运行通过有时分秒,但在程序中和框架搭配一起用,时分秒被 截掉了,为什么。
  )


尝试3:

decode(&c,null,sysdate,&c) 
经测试,通过。


在此请教给位前辈了。。。

------解决方案--------------------
客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。
(1) 在sql*plus中修改当前会话的日期格式
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
将当前会话的时间格式修改为这种格式: 2003-01-28 15:23:38,即四位年-两位月-两位日,空格,24小时的制的小时:分钟:秒。
(2) 修改注册表(只对windows系统)
在注册表/hkey_local_machine/software/oracle/home0主键中增加一个字串(8i版本),字串名为nls_date_format,字串的值为你希望定义的时间格式,如: yyyy-mm-dd hh24:mi:ss ,然后重新启动sql*plus。
这种修改方法,对sql*plus窗口有效,即不论你打开多少个sql*plus窗口,缺省的都是这种时间格式。修改服务器端的注册表无效,只有修改客户端的注册表才有效。
unix系统下有没有这类似的方法,我不知道,我不会用unix或者是linux系统。
------解决方案--------------------
1、
SQL> select sysdate from dual;

SYSDATE
--------------
25-4月 -12

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2012-04-25 22:30:22

SQL> select to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:m
i:ss') from dual;

TO_DATE(TO_CHA
--------------
25-4月 -12

SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> select to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:m
i:ss') from dual;

TO_DATE(TO_CHAR(SYS
-------------------
2012-04-25 22:30:39

SQL> select sysdate from dual;

SYSDATE
-------------------
2012-04-25 22:31:20

SQL>


2、在plsql中,config--user interface --NLS option 可以设置在plsql中日期时间的显示格式。仅生效在plsql中