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

Converting dates and timestamps when inserting data into Teradata

我正在将 Stata(统计软件包)中的数据块插入到 Teradata 数据库中。我在将日期和时间戳从 Stata 的本机格式转换为 Teradata 的格式时遇到问题。

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  

我尝试了两种方法。第一个涉及在插入之前将 dates/timestamps 转换为 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))

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

您无法将 Teradata 中列的数据类型从字符串更改为 date/timestamp。

但是当您将字符串插入 date/timestamp 列时,将会自动进行类型转换。所以只需转换为 '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)