码迷,mamicode.com
首页 > 其他好文 > 详细

数据清洗小记:字符串转日期:时间戳引来的问题

时间:2015-06-16 09:16:32      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:sql   清洗   日期   

原创作品,出自 “深蓝的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_timestampsystimestamp获得时间戳,可以看到在以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(1):奔波于路上,挺进山东

蓝的成长记——追逐DBA(2):安装!安装!久违的记忆,引起我对DBA的重新认知

蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题

蓝的成长记——追逐DBA(4):追忆少年情愁,再探oracle安装(Linux下10g、11g)

蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

蓝的成长记——追逐DBA(6): 做事与做人:小技术,大为人

蓝的成长记——追逐DBA(7):基础命令,地基之石

蓝的成长记——追逐DBA(8):重拾SP报告,回忆oracle的STATSPACK实验

蓝的成长记——追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程

蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere

蓝的成长记——追逐DBA(11):回家后的安逸,晕晕乎乎醒了过来

蓝的成长记——追逐DBA(12):七天七收获的SQL

蓝的成长记——追逐DBA(13):协调硬件厂商,六个故事:所见所感的“服务器、存储、交换机......”

蓝的成长记——追逐DBA(14):难忘的“云”端,起步的hadoop部署

蓝的成长记——追逐DBA(15):以为FTP很“简单”,谁成想一波三折

蓝的成长记——追逐DBA(16):DBA也喝酒,被捭阖了

蓝的成长记——追逐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):伴随建库的亚洲杯——加油中国队

******************************************************************************************************************

数据清洗小记:字符串转日期:时间戳引来的问题

标签:sql   清洗   日期   

原文地址:http://blog.csdn.net/huangyanlong/article/details/46513787

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!