我将数据从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))
但是,我不确定时间戳的公式是什么。我也不知道如何做第二部分(将整数变成日期/时间戳)。
答案 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)