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');