从Select查询中提取完整时间戳(包括日期);神谕

时间:2011-06-13 18:48:16

标签: oracle select bulkinsert

所以我试图从一个表到另一个表插入多行数据。我这样做了;但是,我的一些列有问题,特别是我的日期列。当查询返回数据时,它缺少通常存在的日期的时间组件。如果这没有意义,希望以下有助于事情有意义。

我的原始查询

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。 有谁知道如何解决这个问题?

3 个答案:

答案 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_charto_date函数,否则您将依赖隐式转换,这将导致您遇到的神秘问题,例如您遇到的问题。可能值得阅读Oracle documentation on implicit conversion来找出它为什么不好。

正如Cyber​​nate已经提到的那样,您需要首先将日期/时间列显式转换为字符串(使用to_char),然后使用to_date将其转换回日期。

答案 2 :(得分:0)

首先,您是否有日期字段的一些示例数据?

如果没有存储有关时间戳的信息,那么调用它就没那么好了。

主要问题我会考虑你要从中获取的来源的格式。

从那里你可以设置SELECT语句输出的格式。