如何获取SAS中yyyymm格式的两个日期之间的所有yyyymm日期?

时间:2016-09-22 11:43:42

标签: date sas

我有两个不同的日期201509和201608.我希望得到它们之间的所有日期格式为yyyymm(201509,201510,201511,201512,201601,201602,201603,201604,201605,201606,201607,201608) )。问题是解决几年之间的几个月。此外,几个月不断变化,它可能只是201601到201612.它是一个日常运行代码,我试图在SAS中自动化它。任何帮助赞赏!

3 个答案:

答案 0 :(得分:2)

SAS具有允许您轻松完成此操作的功能,但您必须先将日期转换/读取为“SAS日期”。然后,您可以使用INTCK计算开始和结束之间的月份以及INTNX来创建新的月份日期值。

data months;
   input (start end)(:yymmn.);
   format start end yymm.;
   do i = 0 to intck('month',start,end);
      month = intnx('month',start,i);
      output;
      end;
   format month yymm.;
   cards;
 201509 201608
 ;;;; 
   run;
proc print;
   run;

答案 1 :(得分:0)

如果它们已经是日期格式,那么在间隔上添加一天,它可以像

一样简单
where date between '01Jan2016'd and '31Dec2016'd;

如果你无法弄清楚每天的逻辑,你可以创建为你做的宏变量。

%let start=201601;
%let end=201612;
%let start_date = %sysfunc(inputn(&start, yymmn6.), date9.);
%let end_date = %sysfunc(intnx(month, %sysfunc(inputn(&end, yymmn6.)), 0, end), date9.);
%put &start_date.;
%put &end_date;

答案 2 :(得分:0)

逻辑在下面。

   For intY = intStartYear To intEndYear
      If intY = Value(intEndYear) Then intZ = Value(intEndMonth) Else intZ = 12
      For intX = intStartMonth To intZ
         If intX < 10 Then
            Print intY & "0" & intX
         Else
            Print intY & intX
         End If
      Next intX
      intStartMonth = 1
   Next intY