有没有一种方法可以创建一个全局宏,通过一个经常使用的等式从proc sql运行数据?

有没有一种方法可以创建一个全局宏,通过一个经常使用的等式从proc sql运行数据?,sql,sas,Sql,Sas,所以实际上,我想做的是获取sql日期A,并将其通过一个简短的等式,使其吐出我需要的数字 我有代码可以从不同区域的多个不同表中提取信息。此信息包含日期,有些是从旧表中提取的oracle格式,有些是sas格式,有些是数字日期键,并作为数字存储在表中。现在,我将所有日期转换为YYYYMMDD的数字日期键格式,主要是因为表中的大多数日期已经存储为数字日期键。也就是说,我通常会将表中实际存在的日期作为如下日期: year(datepart(a.dt))*10000+month(datepart(a.dt)

所以实际上,我想做的是获取sql日期A,并将其通过一个简短的等式,使其吐出我需要的数字

我有代码可以从不同区域的多个不同表中提取信息。此信息包含日期,有些是从旧表中提取的oracle格式,有些是sas格式,有些是数字日期键,并作为数字存储在表中。现在,我将所有日期转换为YYYYMMDD的数字日期键格式,主要是因为表中的大多数日期已经存储为数字日期键。也就是说,我通常会将表中实际存在的日期作为如下日期:

year(datepart(a.dt))*10000+month(datepart(a.dt))*100+day(a.dt)) as blahdt
在sql过程的中间。这一切都很好,但是我想知道在代码的一开始是否有一个小宏可以编写,当我必须在同一代码中将该等式应用于多个不同的a.dt项时,我可以使用它。类似这样的事情,虽然我已经知道这并不完全像这样:

%macro dateChange(dt1);
  newDt = year(datepart(dt1))*10000+month(datepart(dt1))*100+day(datepart(dt1));
  %put &newDt;
%mend

proc sql;
select %dateChange(a.dt) from somewhere;
quit;

这将使我能够在整个代码中从多个不同的表中提取日期值,而无需在每个表上重写公式。正如我所说的,我甚至不能完全肯定这是可能的,但我想我会继续问下去。谢谢你的帮助

你们非常接近。仅将计算部分放置在宏中。宏将发出计算源代码

%macro dateChange(sas_datetime);
   year (datepart(&sas_datetime))*10000 + 
   month(datepart(&sas_datetime))*100 + 
   day  (datepart(&sas_datetime))
%mend;

proc sql;
  select %dateChange(a.dt) as dt_changed from somewhere as a;
quit;
计算将日期时间值更改为yymmdd6格式的日期部分表示形式。因此,另一种选择可能是

%macro dt_to_ymdNum(datetime); 
  input(put(datepart(&datetime),yymmdd6.), 6.)
%mend;

proc sql;
  select %dt_to_ymdNum(a.dt) as dt_as_datenum from somewhere as a;
quit;
我会对签署日期值编码为

yy * 10000 + mm * 100 + dd

在数据存储中。您可能希望确保这是实际情况,因为这在新设计中是不寻常的,但可以在旧数据表中找到。

太棒了!老实说,我认为这是行不通的。我想我只是看错了一点宏。非常感谢。总的来说,是的,大部分问题都是由我这边的新表和旧表引起的,在所有的表都清理干净之前,我仍然需要收集所有的数据。一团糟。而且有点令人沮丧。再次感谢!是否所有不在YY、YYM、MDD样式的日期时间变量中的变量都与公式假设的三分之二相同?或者其中一些是实际的日期值?有没有不使用PUTdatepartd1、yymmddn8的原因。它将日期创建为数字YYYYMMDD。我建议使用PROC FCMP来创建一个函数,而不是使用宏。