这个应该跟你的时间类型没有关系的 只要你的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)
那个VARCHAR2字段的长度只能是8位的
这个也是个神奇的规定,难道是不许用PL/SQL,只能用标准SQL? 我上面那个用法不行?
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
--更新的时候改下会话的时间格式 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
--先加一列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
情况是这样的:表A中字段DATETIME1是DATE类型的,表B中字段DATETIME2是VARCHAR2类型的,现在要将表A中的DATETIME1的值插到表B中的DATETIME2中,所以要将DATE类型转化成VARCHAR2类型。
满足你要求?
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行。
可是我们系统DATE类型的默认值一般都是'2010/09/15或2010-09-15',VARCHAR2类型存放日期一般都是8位的,如20100915。可以这么说,就是将'2010/09/15或2010-09-15'的DATE类型转换为长度为8位的'20100915'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)
这个也是个神奇的规定,难道是不许用PL/SQL,只能用标准SQL?
我上面那个用法不行?
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
--更新的时候改下会话的时间格式 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
几十万笔不算啥 就用to_char吧
select name,''||birth from tb;
连to_char都不能用了
有可能你经过‘’||birth处理后的日期格式和varchar2类型的时间格式不一致。
如:经过''||birth后的字符串是'23-1月 -82',而另外一个表中的格式是'2010-09-16 12:30:30'所以我认为还是用to_char()把date型的数据,转换成对应格式的字符串最好。
话说,如果在sqlserver里面也是以上这情况的话,是不是楼主可以考虑这么用?
select name,''||birth from tb;
好想法。