Teradata日期时间格式转换问题

最近在入库一大批数据,入了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

文本源数据通常将日期和时间都默认在一个字段​。而我的想法是:为了减轻后期数据查询的难度,将日期时间型数据都整理为对应的日期时间型,即DATETIME,这样后期就不用其他的cast等函数进行查询。

因此处理的步骤为:
Teradata日期时间格式转换问题_第1张图片
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文档即可,这里不详细介绍了。
  以下是几个例子:
Teradata日期时间格式转换问题_第2张图片
4、字段类型转换

  通过以上步骤,基本上可以将数据处理成对应的格式,在外层再加一个select的语句进行最后的转换即可。

  例如:

select cast(字段A​ as DATE FORMAT 'YYYY-MM-DD') as date_name,
       cast(字段B as TIME) as time_name
from 
      (select ​ case when length....else....end as 字段A
              ,case when length....else....end as 字段B
              from temp
      )​ a
      ;

5、检查

  将入库的字段进行查询检查,看是否处理不当或者存在编码问题,检查数据量是否一致等等。​

你可能感兴趣的:(数据处理)