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

原创作品,出自 “深蓝的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(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):伴随建库的亚洲杯——加油中国队

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

时间: 2025-01-05 12:36:46

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

SpringMVC后台使用对象接受参数字符串转日期

在springMVC配置文件中加入: <bean id="dateConvert" class="com.iomp.util.DateConvert"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property

mysql 日期 时间戳 转换

/***************************************************************************************** * mysql 日期 时间戳 转换 * 说明: * 要通过Python获取数据库中的时间信息,发现需要另外进行转换才行. * * 2016-10-13 深圳 南山平山村 曾剑锋 **********************************************************************

mysql str_to_date字符串转换为日期

mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期. 示例:分隔符一致,年月日要一致 select str_to_date('2008-4-2 15:3:28','%Y-%m-%d %H:%i:%s'); select str_to_date('2008-08-09 08:9:30', '%Y-%m-%d %h:%i:%s'); 对于这个已经理解,但是为何查询字段时使用这种方法查询出来的数据为null???? 刚发现的问题,尝试在client上查询,发现可以出现

将字符串转换为日期比较大小

//将字符串转换为日期            var begin = new Date($("#<%=txtNow.ClientID %>").val().replace(/-/g, "/"));            var end = new Date($("#<%=txtENDTIME.ClientID %>").val().replace(/-/g, "/"));            //js

jQuery截取字符串、日期字符串转Date、获取html中的纯文本

jQuery截取字符串.日期字符串转Date.获取html中的纯文本. var com = com || {}; (function ($, com) { /* * 截取字符串 * @param str:要截取的字符串 * @param len:保留多少字符 * @param symbol:超过之后字符串末端要添加的字符 */ com.cutStr = function (str, len, symbol) { if (symbol == undefined) { symbol = "...&q

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  Select 列 into 新表;字符串函数;日期函数 SQL聚合函数 MAX(最大值).MIN(最小值).AVG(平均值).SUM(和).COUNT(数量:记录的条数) 聚合函数对null不计算.如果一行数据都是null,count(*)包含对空值行.重复行的统计. --聚合函数演示 selec

使用SimpleDateFormat注意的地方和在jsp中将字符串转换为日期

一.使用SimpleDateFormat注意的地方 SimpleDateFormat将字符串转换为日期类型时,转换的格式必须和字符串的格式一样,否则就会报错,比如:将字符串"20150825195057"转化为日期类型,转换格式必须是 "yyyyMMddHHmmss",如果是其他格式,将会报   java.text.ParseException: Unparseable date: "20150825195057"异常.那如果要将字符串转换成yy

Java 日期字符串与日期类型转换

1.SimpleDateFormat.format 把日期类型转化到指定格式字符串 public static String convToString(Calendar cld,String template){ String resultString=null; try { Date date=cld.getTime(); SimpleDateFormat sdf=new SimpleDateFormat(template,Locale.getDefault()); resultString=

Java中字符串与日期之间的转换

项目过程中,经常遇到需要字符串格式的日期和Date类型的日期之间的相互转换.使用SimpleDateFormat类,可以方便完成想要的转换. SimpleDateFormat能够实现本地化的时间格式化及转换.从选定一个自定义的模式(pattren)开始,模式由已经定义好的 'A' to 'Z' 及 'a' to 'z'字母组成,也可以在模式中引入文本,但要使用’(单括号)括住.下图就是已经定义好的模式字母表: Letter Date or Time Component Presentation

oracle 字符串与日期转换sql

常用sql语句: select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual;   //显示:08-11-07 13:22:42 select to_date('2005-12-25,13:25:59','yyyy-mm-dd,hh24:mi:ss') from dual; //显示:2005-12-25 13:25:59 获取系统时间: select sysdate from dual; 转换的格式: 表示year的:y  表示年的最后一位