使用Proc SQL将数据插入Teradata

时间:2019-02-11 08:56:12

标签: sas

我必须将数据从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日。

1 个答案:

答案 0 :(得分: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