原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则有权追究版权法律责任。
深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46513787
【背景】
在进行数据抽取时,源端“时间意义”字段数据为“时间戳格式”,而且字段类型为字符串类型。但是目标端要求,进入数据为date类型,需要清洗。
【解决】
遇到这种问题,起初可能会比较棘手,但通过对“时间戳格式”进行简单分析后,我们会发现有法可施。
例如下面这种格式:
'14-JUN-15 08.23.35.048000 PM +08:00','DD MON YYYY HH.MI AM'
可以使用这样的处理方式:
select to_date(replace(substr('14-JUN-15 08.23.35.048000 PM +08:00',1,18),'.',':')||substr('14-JUN-15 08.23.35.048000 PM +08:00',26,3),'DD-MON-YY HH:MI:SS AM') from dual;
处理后的结果如下:
2015/6/14 20:23:35
上面的处理方法,其实很简单,就是把时间戳拆分成两部分,然后分别处理后做了一个拼接而已,如下这样分步查询出来就一目了然了,如下:
再来看看正确使用时间戳的方式,如下举例:
create table 实验表 (ID varchar2(32) default sys_guid(), DATE_TIMESTAMP date default systimestamp, memo varchar2(32) ); insert into 实验表 (memo) values(1); insert into 实验表 (memo) values(2); insert into 实验表 (memo) values(3); commit; select * from 实验表;
也可以使用下面这样的方式,如下:
create table 实验表2 (ID varchar2(32) default sys_guid(), DATE_TIMESTAMP date default current_timestamp, memo varchar2(32) ); insert into 实验表2 (memo) values(1); commit; select * from 实验表2;
通过上面演示,我们可以使用current_timestamp或systimestamp获得时间戳,可以看到在以date为类型的字段插入时间戳时,显示的为正常的时间格式,因为已经被oracle进行了隐式转换了,但是如果单独查询会是如何呢?按下面的方式查询:
select sessiontimezone,current_timestamp from dual;
可以看到,时间戳默认是以“14-JUN-15 08.23.35.048000 PM +08:00”格式显示的,这也就意味着如果建表时,“该字段你没有date类型”或“用了varchar2类型但是没有强制转换”的话,存入到该字段的内容是这样格式的。当把该字段抽取到以date为类型的表时,便会遇到问题。
【实验】
构建源端数据表(实验表3)、目标表,如下:
create table 实验表3 (ID varchar2(32) default sys_guid(), DATE_TIMESTAMP varchar2(50) default current_timestamp, memo varchar2(50) ); select * from 实验表3; insert into 实验表3 (memo) values(1); insert into 实验表3 (memo) values(2); insert into 实验表3 (memo) values(3); insert into 实验表3 (memo) values(4); commit; create table 目标表 (ID varchar2(32), DATE_TIME date, memo varchar2(50) );
未处理的抽取操作:
添加“清洗”操作后,抽取数据操作:
INSERT /*+append*/ INTO 目标表 nologging SELECT ID ID, to_date(replace(substr(DATE_TIMESTAMP,1,18),'.',':')||substr(DATE_TIMESTAMP,26,3),'DD-MON-YY HH:MI:SS AM') DATE_TIME, MEMO MEMO FROM 实验表3; commit; select * from 目标表;
数据在抽取时已经完成了清洗,并且抽取过来了。
小知识,简而记之。
*******************************************蓝的成长记系列****************************************************
原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。
蓝的成长记——追逐DBA(2):安装!安装!久违的记忆,引起我对DBA的重新认知
蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题
蓝的成长记——追逐DBA(4):追忆少年情愁,再探oracle安装(Linux下10g、11g)
蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统
蓝的成长记——追逐DBA(6): 做事与做人:小技术,大为人
蓝的成长记——追逐DBA(8):重拾SP报告,回忆oracle的STATSPACK实验
蓝的成长记——追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程
蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere
蓝的成长记——追逐DBA(11):回家后的安逸,晕晕乎乎醒了过来
蓝的成长记——追逐DBA(13):协调硬件厂商,六个故事:所见所感的“服务器、存储、交换机......”
蓝的成长记——追逐DBA(14):难忘的“云”端,起步的hadoop部署
蓝的成长记——追逐DBA(15):以为FTP很“简单”,谁成想一波三折
蓝的成长记——追逐DBA(17):是分享,还是消费,在后IOE时代学会成长
******************************************************************************************************************
********************************************足球与oracle系列*************************************************
原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。
足球与oracle系列(1):32路诸侯点兵,oracle32进程联盟 之A组巴西SMON进程的大局观
足球与oracle系列(2):巴西揭幕战预演,oracle体系结构杂谈
足球与oracle系列(3):oracle进程排名,世界杯次回合即将战罢!
足球与oracle系列(4):从巴西惨败于德国,想到,差异的RAC拓扑对比!
足球与oracle系列(5):fifa14游戏缺失的directX库类比于oracle的rpm包!
足球与oracle系列(6):伴随建库的亚洲杯——加油中国队
******************************************************************************************************************
原文地址:http://blog.csdn.net/huangyanlong/article/details/46513787