【问题标题】:SAS insert date formatSAS 插入日期格式
【发布时间】:2020-01-22 17:12:33
【问题描述】:

我有以下代码:

PROC SQL;

    CREATE TABLE Hub_Category2 (
    CategoryID INT NOT NULL,
    CategoryName VARCHAR(15) NOT NULL,
    LOAD_DATE NUM FORMAT=DATETIME22. NOT NULL,
    RECORD_SOURCE VARCHAR(255) NOT NULL);
RUN;

quit;

%let "LOAD_DATE: %sysfunc(datetime(),datetime22.)"; 

%let RECORD_SOURCE='123'; 

proc sql;

    CREATE VIEW VIEW_HUB_CATEGORIES AS
    SELECT 
    CategoryID,
    CategoryName,
    &LOAD_DATE as LOAD_DATE, 
    &RECORD_SOURCE as RECORD_SOURCE 
    FROM  LIB.CATEGORIES;
RUN;
Quit;

当我运行以下代码时

proc sql;

  insert into Hub_Category2 select * from VIEW_HUB_CATEGORIES;

  run;

Quit;

它给出了以下错误。

proc sql;
    72         insert into Hub_Category2 select * from VIEW_HUB_CATEGORIES;
 ERROR: Value 3 on the SELECT clause does not match the data type of the 
corresponding column listed after the INSERT table name.

我想,我在格式化日期、插入或使用宏时犯了错误。请帮帮我

【问题讨论】:

  • 您的第一个 %let 语句不是有效的 SAS 代码,因为它不包含您要为其赋值的宏变量名称。你实际运行了什么代码?
  • 为什么要把一个固定的日期时间值放到一个视图中?您是否尝试记录创建视图的时间?如果您想在使用视图拉取数据时执行datetime() 函数,则将实际函数调用编码到视图定义中而不是常量值。

标签: sql sas sas-macro


【解决方案1】:

宏变量LOAD_DATE 要么不存在,要么在源代码生成方面的值不正确。

试试

%let LOAD_DATE = %sysfunc(datetime());  %* macro variable value is source code (a bunch of digits) representing current datetime;
%let RECORD_SOURCE = '123';             %* macro variable value is source code for a single quoted string literal;

proc sql;
    CREATE VIEW VIEW_HUB_CATEGORIES AS
    SELECT 
    CategoryID,
    CategoryName,
    &LOAD_DATE as LOAD_DATE, 
    &RECORD_SOURCE as RECORD_SOURCE 
    FROM  LIB.CATEGORIES;
RUN;

LOAD_DATE 列中的值

&LOAD_DATE as LOAD_DATE

不需要为便于阅读而格式化,它需要是日期时间值本身。

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2013-01-11
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多