将数据插入Teradata时转换日期和时间戳

时间:2015-04-19 05:04:48

标签: date datetime stata teradata

我将数据从Stata(统计包)块插入到Teradata数据库中。我无法将日期和时间戳从Stata的原生格式转换为Teradata's。

Stata将日期存储为自01/01/1960以来的日期,因此01jan1960为0且02jan1960为1.时间戳以01jan1960 00:00:00.000之后的毫秒存储,因此1000为01jan1960 00:00:01。以下是一些例子:

          timestamp   Stata's tstamp  date           Stata's date  
2015-04-13 03:07:08   1744513628000   2015-04-13     20191  
2015-04-14 19:55:43   1744660543000   2015-04-14     20192  
2015-04-08 11:41:39   1744112499000   2015-04-08     20186  
2015-04-15 06:53:34   1744700014000   2015-04-15     20193  

我尝试了两种方法。第一个涉及在插入之前将日期/时间戳转换为Stata中的字符串,然后在插入数据后执行类似的操作:

ALTER TABLE mytable ALTER date_variable DATETIME

但是,我无法弄清楚如何从我的文档和搜索各种论坛后做第二部分。

第二种方法是将日期和时间戳保留为整数,然后在插入整数后进行一些转换。也许我也可以将Stata中的日期转换为TD的内部格式:

gen td_date = ((year(stata_dt)-1900)*10000 + month(stata_dt)*100 + day(stata_dt))

但是,我不确定时间戳的公式是什么。我也不知道如何做第二部分(将整数变成日期/时间戳)。

1 个答案:

答案 0 :(得分:1)

您无法将Teradata中列的数据类型从字符串更改为日期/时间戳。

但是当你在日期/时间戳列中插入一个字符串时,会有一个自动的类型转换。因此,只需转换为带有' yyyy-mm-dd'或者&yyyy-mm-dd hh:mi:ss'格式。

您也可以使用计算在Teradata上加载期间进行转换,但恕我直言第一解决方案更可取:

 -- add the number of days to the start date
DATE '1960-01-01' + stata_dt

-- I use a similar approach for Unix Timestamps starting 1970 :-)
-- split into days and seconds
CAST(DATE '1960-01-01' + (stata_ts / 86400000) AS TIMESTAMP(0))
+ ((stata_ts MOD 86400000 / 1000) * INTERVAL '00:00:01' HOUR TO SECOND)