【问题标题】:Inserting Data into Teradata using Proc SQL使用 Proc SQL 将数据插入 Teradata
【发布时间】:2019-07-04 17:32:52
【问题描述】:

我必须将数据从 SAS EG 插入 Teradata。我正在为此使用 Proc SQL。

正在插入数据,但日期错误。

我尝试了不同的格式,但日期仍然是 01-01-1960

Proc Sql;
insert into teradata (emailid,status,delivery_date) select emailid,status,delivery_date from table;
quit;

请注意,插入 teradata 的日期为 01-01-1960。但实际日期是 2018 年 2 月 11 日。

【问题讨论】:

  • 写 SAS 日期是一件很痛苦的事。您可能会在之前的帖子中找到一些指针:stackoverflow.com/questions/53781236/…
  • 这是实际代码吗? into teradata 将插入到工作库中的 SAS 数据集中。
  • Teradata 是表名

标签: sas


【解决方案1】:

尝试(未经测试)

Proc Sql;
  insert into teradata (emailid,status,delivery_date)
  select 
      emailed
    , status
    , ( delivery_date - '01JAN1970'D ) * 86400
  from
    table
  ;
quit;

%macro SAS_D_to_TERA_TS (sas_date);
  ( &sas_date - '01JAN1970'D ) * 86400
%mend;
… 
  , %SAS_D_to_TERA_TS ( delivery_date )

SAS DATETIME 值是自 01-JAN-1960 以来的小数秒数。
SAS DATE 值是自 01-JAN-1960 以来的天数。
Teradata TIMESTAMP 值是自 01-JAN-1970 以来的十进制秒数。

DATETIME 和 TIMESTAMP 具有相同的单位,尽管来源不同(纪元)

从 SAS 日期值到 Teradata 时间戳值的转换需要

  • 将 SAS 日期值转换为 Teradata 纪元作为 SAS 日期
    • - '01-JAN-1970'D
  • 将转换后的日期值缩放为日期时间(也称为时间戳)值。
    • * 86400(一天中的秒数)

错误转换为 DateTime 值时的日期值

data _null_;    
  delivery_date = '11FEB2018'D;

  put delivery_date= MMDDYY10.;
  put delivery_date= DATETIME.;

  delivery_date_dt = delivery_date * 86400;
  put delivery_date_dt= DATETIME.;

  sas_date_epoch = '01JAN1960'D;
  put sas_date_epoch=;

  teradata_date_epoch = '01JAN1970'D;
  put teradata_date_epoch= 'days after SAS epoch';
run;
----------- LOG -----------
delivery_date=02/11/2018
delivery_date=01JAN60:05:53:46
delivery_date_dt=11FEB18:00:00:00
sas_date_epoch=0
teradata_date_epoch=3653 days after SAS epoch

【讨论】:

  • 您能再问一个问题吗?我正在使用 SAS 中的数据步骤导入 CSV。在 CSV 中,我的日期格式为“DD MMM YYYY HH:MM:SS GMT”,而仅导入日期即将到来。我没有得到日期的时间
  • 最佳做法是发布一个带有一些示例数据的新问题,尝试导入代码并看到任何错误或消息。
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2015-10-21
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多