Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 从Select查询中提取完整的时间戳(包括日期);神谕_Oracle_Select_Bulkinsert - Fatal编程技术网

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

Oracle 从Select查询中提取完整的时间戳(包括日期);神谕,oracle,select,bulkinsert,Oracle,Select,Bulkinsert,因此,我尝试将多行数据从一个表插入到另一个表中。我已经这样做了;然而,我的一些专栏,特别是我的日期专栏有问题。当查询返回数据时,它缺少通常存在的日期的时间部分。如果这没有意义,希望下面的内容有助于理解 我最初的疑问 SELECT 'insert into dante2 (subcar, batch_id, silicon, temperature, sulphur, manganese, phosphorus, start_pour, end_pour, sched_cast_date) val

因此,我尝试将多行数据从一个表插入到另一个表中。我已经这样做了;然而,我的一些专栏,特别是我的日期专栏有问题。当查询返回数据时,它缺少通常存在的日期的时间部分。如果这没有意义,希望下面的内容有助于理解

我最初的疑问

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

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

如果没有存储关于时间戳的信息,调用它就没有什么好处

主要的问题是,我会研究你从中获取的源文件的格式

您可以在此设置SELECT语句输出的格式。

两个选项:

1) 如果您具有alter session权限,请在运行
SELECT
语句之前更改NLS\u DATE\u格式,如下所示:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-RR HH24:MI';
2) 如果您没有ALTER session权限,则对每个日期字段应用转换,如下所示(下面的stmnt显示了START\U POUR的转换)


我想知道你是不是把这个问题弄得比它需要的更复杂了

有一种简单的
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
函数,否则您将依赖于隐式转换,这将导致您遇到一些神秘的问题,比如您正在经历的问题。也许值得一读这本书,看看它为什么不好


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

我试图插入数据库中其他表中的所有数据。当我运行select语句检查数据时,我会得到一个完整的时间戳,其中包括小时:分和秒,如果我想让它们从bof_chem样本bcs中选择char(bbp.START_POUR,'dd MON yy hh:MI')、bbp.BATCH_ID、bcs.SILICON、bcs.sulf、bcs.mange、bcs.phosphour、bofcs.temperature、to_char(bbp.END_POUR,'dd MON yy hh:MI'),bof\U批次灌注bbp、bof\U celox\U样本BOFC,其中bcs.样本代码=至字符('D1')和BOFC.样本代码=bcs.样本代码和BOFC.批次id=bcs.批次id和bcs.批次id=bbp.批次id和BOFC.温度>0和bbp.开始灌注>=至日期('11年6月10日')我不清楚你的回答是什么。当你说timestamp时,你指的是datetime列的数据类型还是时间部分。。。您只是询问日期数据类型的时间部分。那太好了时间戳您不需要使用ALTER SESSION特权来执行ALTER SESSION来设置NLS_DATE_格式。[实际上,大多数ALTER SESSION选项都不需要ALTER SESSION特权。]虽然它工作得很好,但为了便于说明,在将日期转换为字符串时,我会使用YY而不是RR-没有人应该仍然使用RR。甲骨文发布它是为了解决千年虫问题。但它有一个固定的窗口,因此它本身正逐渐成为一个bug。不要偷懒,只要显示日期,就坚持YYYY。
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');