今天做oracle数据库更新的时候,Last_date 数据库定义类型为Date.如果传入的日期参数为null,则Last_date = oracle系统时间。格式要求 年/月/日 时:分:秒.实现过程中出现问题了。尝试1: to_char(sysdate,'yyyy/mm/dd hh24:mi:ss')  -- 值为 2012/4/23 19:20:34to_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) 
经测试,通过。
在此请教给位前辈了

解决方案 »

  1.   

    to_date之后是个date类型date类型 永远有年月日时分秒,所谓的“没有”没显示出来。想要格式用to_char
      

  2.   

    应用程序中是什么语言,要用带时分秒的数据类型,否则会截断。
    再有就是,直接查询出带时分秒的字符串,然后在程序中用String保存,再进行自己的处理。
      

  3.   

    如果本身是一个带有时分秒的日期类型,那么肯定不会丢的,
    楼主所看到的丢是怎么看到的?
    是通过程序debug看到的?还是通过oracle工具看到的?
    这个其实是你debug时的表示问题,时分秒肯定还在,不会丢的!
    不信的话,楼主可以用select to_char(date,'yyyy/mm/dd hh24:mi:ss') 的形式查询下你更新的字段,看下有没有时分秒!如果楼主非要看到时分秒,建议楼主可以把类型改成timestamp类型,这样你在debug的时候就可以看到时分秒了!
      

  4.   


    开发语言java。java.util.Date date = null; 传入日期date。查询出带时分秒的字符串之后,在更新数据库时,时间就跟当前oracle时间对不上,有时差了。
    所以,必须在sql语句中做日期为空的判断,并且将带时分秒的日期插入进去。
      

  5.   


    在Pl/sql中,进行尝试1,插入数据时。时分秒看不到。去试试您说的 select to_char(date,'yyyy/mm/dd hh24:mi:ss')不过就算这样时分秒可以看到,但我想让时分秒显示的表示啊,而不是2012/4/23。做开发的。数据库定义不能改,你懂的。
    尝试过timestamp。这个会带有时间戳。采用substr也截取过字符串,然后在将其to_date.昨天试过了的,好像不行,今天在去试试看 
      

  6.   

    客户端与数据库建立起连接后,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系统。
      

  7.   


    谢谢您的经验之谈.不过
    我用的是windows 系统。不过开发工具用的是PL/SQL . 和Sql*plus 有点不一样呢
      

  8.   

    1、
    SQL> select sysdate from dual;SYSDATE
    --------------
    25-4月 -12SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;TO_CHAR(SYSDATE,'YY
    -------------------
    2012-04-25 22:30:22SQL>  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月 -12SQL>  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:39SQL> select sysdate from dual;SYSDATE
    -------------------
    2012-04-25 22:31:20SQL>
    2、在plsql中,config--user interface --NLS option 可以设置在plsql中日期时间的显示格式。仅生效在plsql中
      

  9.   


    11和13楼是高手。膜拜。。
    按照2位说的。问题是可以解决了。不过还有个疑问想请教一下
    alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
    这条语句是执行一次之后,以后所有的日期格式会话都是'yyyy-mm-dd hh24:mi:ss'吗?
    关掉PL/SQL再次打开,sysdate还仍然是这个'yyyy-mm-dd hh24:mi:ss'格式吗?
      

  10.   

    alter session 是更改本次session的。断开连接就无效了。如果想长期有效,用系统级的命令
    alter system 
      

  11.   


    今天试过您的方法。
    这句话 alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss'; 在我的PL/sql version7.0.3 中执行无效的错误,如果改为alter system set .. 就报alter system 的选项无效的错。
    去查了下,又试了 alter system set nls_date_format = 'yyyy-mm-dd hh24:mi:ss' scope=spfole.貌似也报同样的错。不知道您上面的语句是怎么执行成功的呢?另外。我的操作系统所日文version.PL/SQL也是日文的。config --user interface 对应的日文没找到呢,又在工具-选项中找了个遍,也没找到呢,能麻烦说的更详细些吗
      

  12.   

    用to_char格式化时间,to_date用来显示时间不会进行格式化
      

  13.   


    这句SQL> select to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:m
    i:ss') from dual;    -- 结果输出 2012/04/26 11:11:48 
    和 select sysdate from dual ; --结果输出 2012/04/26 11:11:48  在我的PL/sql中不进行alter nls_date_formart 也可以出来结果的。但我在框架中执行
    insert into 
      table(
      a,
      b,
      c
      )values (
      &a,
      &b,
      nvl(&c,to_date(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'))
    之后。插入数据库中的数据就没时分秒。于是, 我这样写。alter nls_date_formart(我的PL/sql修改不鸟nls_date_formart) ,修改过注册表(出重启过pl/sql,重启过电脑)。时分秒出不来。declare
    begin
        dbms_output.put_line(to_date(to_char(sysdate,'yyyy/mm/dd hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') );
    end;控制台
    -----
    12-04-26我郁闷了求解阿。我说的是不是有点复杂阿
      

  14.   

    开发中用date类型是不能存储时分秒的,框架中需要用时间戳类型进行存储
      

  15.   

    date类型,有一个默认的格式,只要你是以date类型来存储的,就是这个格式,可以改,11楼已经说的很清楚了,我觉得to_date(*****,'格式')不是把*****转换成某格式的date类型数据,而是按照某格式改成date类型数据