2015-04-19 101 views
0

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

Stata存储自01/01/1960以来的日期,因此01jan1960为0并且02jan1960为1.时间戳记自01jan1960 00:00:00:00开始以毫秒为单位存储,因此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 

我试过2种方法。第一个涉及插入,然后一旦数据被插入做这样的事情之前转换日期/时间戳在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

您无法将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)