比如2010/09/15是DATE类型   不用TO_CHAR()的方法,怎么转换成VARCHAR2类型,效率要高些。
有可能数据有几十万笔。

解决方案 »

  1.   

    是要永久的修改?
    --先加一列varchar2类型的,然后将date类型的值复制到varchar2类型中
    SQL> create table test(
      2  testime date);表已创建。SQL> insert into test values (sysdate);已创建 1 行。SQL> commit;
    SQL> alter table test add testtime varchar(50);表已更改。SQL> update test set testtime=testime;已更新 1 行。SQL> commit;提交完成。SQL> select * from test;TESTIME        TESTTIME
    -------------- -------------------------------------------------
    15-9月 -10     15-9月 -10
      

  2.   

    公司开发的系统不推荐使用TO_CHAR()。
    情况是这样的:表A中字段DATETIME1是DATE类型的,表B中字段DATETIME2是VARCHAR2类型的,现在要将表A中的DATETIME1的值插到表B中的DATETIME2中,所以要将DATE类型转化成VARCHAR2类型。
      

  3.   

    select name,''||birth from tb;
    满足你要求?
      

  4.   

    这个可以直接插入吧,例如我下面的例子SQL> create table test (testtime varchar2(50));表已创建。
    SQL> insert into test select hiredate from emp;已创建14行。SQL> commit;提交完成。SQL> select * from test;TESTTIME
    -------------------------------------------------
    17-12月-80
    20-2月 -81
    22-2月 -81
    02-4月 -81
    28-9月 -81
    01-5月 -81
    09-6月 -81
    19-4月 -87
    17-11月-81
    08-9月 -81
    23-5月 -87TESTTIME
    -------------------------------------------------
    03-12月-81
    03-12月-81
    23-1月 -82已选择14行。
      

  5.   

    将birth字段的值连接上空字符串 这样内容没有变 但是类型就成字符型了
      

  6.   

    你的方法是不错。
    可是我们系统DATE类型的默认值一般都是'2010/09/15或2010-09-15',VARCHAR2类型存放日期一般都是8位的,如20100915。可以这么说,就是将'2010/09/15或2010-09-15'的DATE类型转换为长度为8位的'20100915'VARCHAR2类型。
      

  7.   

    这个应该跟你的时间类型没有关系的 只要你的varchar2的长度足够久可以了--例如这是个长度足够的例子
    SQL> create table test (testtime varchar2(50));表已创建。SQL> insert into test select hiredate from emp;已创建14行。
    SQL> select * from test where rownum<5;TESTTIME
    --------------------------------------------------
    1980-12-17 00:00:00
    1981-02-20 00:00:00
    1981-02-22 00:00:00
    1981-04-02 00:00:00--下面是个长度不够得例子
    SQL> create table test2 (testtime varchar2(10));表已创建。SQL> insert into test2 select hiredate from emp;
    insert into test2 select hiredate from emp
                             *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."TEST2"."TESTTIME" 的值太大 (实际值: 19, 最大值: 10)
      

  8.   

    那个VARCHAR2字段的长度只能是8位的
      

  9.   


    这个也是个神奇的规定,难道是不许用PL/SQL,只能用标准SQL?
    我上面那个用法不行?
      

  10.   


    SQL> create table t (d varchar2(8));Table created.-- 修改 nls_date_format 
    SQL> alter session set nls_date_format='yyyymmdd';Session altered.SQL> insert into t values(sysdate);1 row created.SQL> select * from t;D
    --------
    20100915
      

  11.   


    --更新的时候改下会话的时间格式 SQL> alter session set nls_date_format='yyyymmdd',把它隐性转为字符就可以了,下面是个例子SQL> create table test6(id number,dt date,ch varchar2(8))
      2  /表已创建。SQL> edi
    已写入 file afiedt.buf  1  insert into test6(id,dt) select 1,to_date('2010-09-15','yyyy-mm-dd') from dual
      2  union all
      3* select 2,to_date('2010/08/15','yyyy/mm/dd') from dual
    SQL> /已创建2行。SQL> commit
      2  /提交完成。SQL> alter session set nls_date_format='yyyymmdd'
      2  /会话已更改。SQL> update test6 set ch=''||dt
      2  /已更新2行。SQL> commit
      2  /提交完成。SQL> select * from test6
      2  /        ID DT       CH
    ---------- -------- --------
             1 20100915 20100915
             2 20100815 20100815
      

  12.   

    ''||sysdate 还不是要调用to_char  道理一样吧 
     几十万笔不算啥 就用to_char吧
      

  13.   

    --这个好用,呵呵呵
    select name,''||birth from tb;
      

  14.   

    呵呵...
    连to_char都不能用了
      

  15.   

    to_char不用的话怎么指定格式转换呢?上面的转换都是以来NLS_DATE_FORMAT参数的,你怎么保证不同数据库环境得到的数据还一样?毫无道理的规定啊.
      

  16.   

    才几十万笔???很多蛮?  我每个表中数据至少都是上百万,照样用to_char()函数来进行时间字串的格式转换搞的那么复杂干啥子嘛?你不去试一下,你咋知道就不得行呢?非要听你们领导说不能用to_char啊?变态TL
      

  17.   

    我想把表a里的f1字段从1改成2,不许用update语句
      

  18.   

    这不是领导说的,是公司的系统。公司开发的软件是支持多数据库的,to_char() 函数在SQL SERVER不支持,你说可以用不 ?几十万笔我也只是举举例子而已,这几百万的也很多。
      

  19.   

    不同产品兼容的确是个麻烦事,要不干脆不用date类型,直接都用varchar好了。
      

  20.   


    有可能你经过‘’||birth处理后的日期格式和varchar2类型的时间格式不一致。
    如:经过''||birth后的字符串是'23-1月 -82',而另外一个表中的格式是'2010-09-16 12:30:30'所以我认为还是用to_char()把date型的数据,转换成对应格式的字符串最好。
      

  21.   


    话说,如果在sqlserver里面也是以上这情况的话,是不是楼主可以考虑这么用?
      

  22.   

    alter tablename modify date varchar2(30)
      

  23.   

    引用 4 楼 java3344520 的回复:
    select name,''||birth from tb;
    好想法。