最近在入库一大批数据,入了20多张表整整一天半时间,可谓是脸都僵了,然而就在处理日期型和时间型数据,通过自己的摸索,get到了一些套路,还是很开心的,趁请假还是好好总结一下吧!
鉴于日期型数据DATE通常是用YYYY-MM-DD的格式进行存储查询,而时间型数据TIME在网上我也没看到太多参考,但是注意到数据库是有TIME这个类型数据的,格式是HH:MM:SS,因此向着这两个格式去对数据进行整理。
一般我们接到的日期时间型数据完整的文本是长这样的:
2016/11/1 12:00:00 or 2016-11-01 12:00:00 or 2016/11/1 12:00
文本源数据通常将日期和时间都默认在一个字段。而我的想法是:为了减轻后期数据查询的难度,将日期时间型数据都整理为对应的日期时间型,即DATE和TIME,这样后期就不用其他的cast等函数进行查询。
因此处理的步骤为: 1、分割字段
在UE编辑器中将日期时间型数据进行分割,如2016/11/1 12:00:00分割成2016/11/1|12:00:00,其中|为分割符;
2、编辑数据入库脚本
如果源数据的日期本来就是对应的'YYYY-MM-DD'如: 2016-11-01(严格符合,否则出错,2016-11-1也是不符合的)那么入库的时候就可以直接指定字段类型:
日期字段名称 DATE FORMAT(‘YYYY-MM-DD’)
那么分割后的时间字段同理,如果本来的格式就是HH:MM:SS,那么直接指定字段类型:
时间字段名称 TIME
如果源数据不是这种类型的格式,像2016/11/1、2016/11/01这种,那么入库的时候直接用varchar类型入库就好,后期再处理。
3、格式处理
入库了以后,如果格式本来就是对应那两种,那很好,收工检查数据看看有没有乱码和重复数据就好;如果不是那两种,那就要进行数据处理了。 一般入库我会用一个temp作为表名,因为数据格式都比较纯天然。入库以后再建一个新表插入temp表的数据,插入的同时也对数据进行处理。 处理的过程:
先用其他函数对数据进行处理,整理成对应的格式,最后用cast函数对字段进行类型转换。
使用的函数:
casewhen +substring/index/length/||
这些函数自由组合,发挥自己的想象力即可。 简单的来说就是使用 substring / index / length /函数对数据进行识别,用case when 和 || 处理数据,拼接成自己想要的样子,不过要注意同样的一列数据可能存在不同的情况,因此要借用case when来处理,不确定的话可以select一下试试先。 具体的函数功能看看Teradata SQL文档即可,这里不详细介绍了。 以下是几个例子: 4、字段类型转换
通过以上步骤,基本上可以将数据处理成对应的格式,在外层再加一个select的语句进行最后的转换即可。
例如:
select cast(字段A as DATE FORMAT 'YYYY-MM-DD') as date_name, cast(字段B as TIME) as time_namefrom (select case when length....else....end as 字段A ,case when length....else....end as 字段B from temp ) a ;5、检查
将入库的字段进行查询检查,看是否处理不当或者存在编码问题,检查数据量是否一致等等。
新闻热点
疑难解答