所以我试图从一个表到另一个表插入多行数据。我这样做了;但是,我的一些列有问题,特别是我的日期列。当查询返回数据时,它缺少通常存在的日期的时间组件。如果这没有意义,希望以下有助于事情有意义。
我的原始查询
SELECT 'insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date) values(', SUBCAR,',',BBP.BATCH_ID ,',', SILICON ,',',TEMPERATURE ,',', SULPHUR ,',', MANGANESE ,',', pHOSPHORUS ,',''',START_POUR ,''',''', END_POUR,''',''',SCHED_CAST_DATE ,''');'
FROM bof_chem_sample bcs, bof_batch_pour bbp, bof_celox_sample bofcs
WHERE bcs.SAMPLE_CODE= to_char('D1')
and bofcs.sample_code=bcs.sample_code
and bofcs.batch_id=bcs.batch_id
and bcs.batch_id = bbp.batch_id
and bofcs.temperature>0
AND bbp.START_POUR>=to_date('01-JAN-11')
order by bbp.start_pour
查询结果:
insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date)
values( 101,65277 ,0.6631,2525 ,0.0551,0.3366,0.043,'01-JAN-11','01-JAN-11','31-DEC-10');
insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date)
values( 123,65277 ,0.6631,2525 ,0.0551,0.3366,0.043,'01-JAN-11','01-JAN-11','31-DEC-10');
insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date)
values( 123,65278 ,0.7116,2470 ,0.0598,0.333,0.0423,'01-JAN-11','01-JAN-11','31-DEC-10');
insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date)
values( 116,65278 ,0.7116,2470 ,0.0598,0.333,0.0423,'01-JAN-11','01-JAN-11','31-DEC-10');
但是,我希望日期看起来像dd-mon-yy hh24:mi。 有谁知道如何解决这个问题?
答案 0 :(得分:7)
两个选项:
1)如果您有更改会话权限,请在运行SELECT
语句之前更改NLS_DATE_FORMAT,如下所示:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR HH24:MI';
2)如果您没有ALTER会话权限,则对每个日期字段应用转换,如下所示(下面的stmnt显示为START_POUR)
'TO_DATE(''' || TO_CHAR(START_POUR, 'DD-MON-RR HH24:MI') || ''', ''DD-MON-RR HH24:MI'')'
答案 1 :(得分:1)
我想知道你是否让这个问题比它需要的更复杂。
有INSERT
的简单形式,您需要提供VALUES
子句,但您也可以直接插入SELECT
语句的结果。
所以你可以写下这样的东西:
insert into dante2 (
subcar, batch_id, silicon, temperature, sulphur, manganese,
phosphorus, start_pour, end_pour, sched_cast_date
)
SELECT
SUBCAR, BBP.BATCH_ID, SILICON, TEMPERATURE, SULPHUR, MANGANESE,
pHOSPHORUS, START_POUR, END_POUR, SCHED_CAST_DATE
FROM
bof_chem_sample bcs,
bof_batch_pour bbp,
bof_celox_sample bofcs
WHERE
bcs.SAMPLE_CODE= to_char('D1') and
bofcs.sample_code=bcs.sample_code and
bofcs.batch_id=bcs.batch_id and
bcs.batch_id = bbp.batch_id and
bofcs.temperature>0 AND
bbp.START_POUR>=to_date('01-JAN-2011', 'dd-mon-yyyy');
这将具有比现有解决方案快得多的优点,因为您运行的每个INSERT语句都需要时间来解析和执行,但这只有一个语句可以运行。它也可以一步运行,因为您不需要创建INSERT语句,并且所有类型(如日期)都可以正确处理。
但是,如果仍需要创建insert语句,则需要处理数据类型。字符串和数字很好,因为Oracle知道如何处理它们。日期更像是一个问题,因为除非您使用to_char
和to_date
函数,否则您将依赖隐式转换,这将导致您遇到的神秘问题,例如您遇到的问题。可能值得阅读Oracle documentation on implicit conversion来找出它为什么不好。
正如Cybernate已经提到的那样,您需要首先将日期/时间列显式转换为字符串(使用to_char),然后使用to_date将其转换回日期。
答案 2 :(得分:0)
首先,您是否有日期字段的一些示例数据?
如果没有存储有关时间戳的信息,那么调用它就没那么好了。
主要问题我会考虑你要从中获取的来源的格式。
从那里你可以设置SELECT语句输出的格式。