【问题标题】:SAS, picking the wrong date or weekdaySAS,选择错误的日期或工作日
【发布时间】:2021-09-21 13:36:30
【问题描述】:

大家好

我是 SAS 世界的新手,几天前我接到了这个挑战,想找出这份工作失败的原因。我很快发现错误可能在于定义日期或星期几的方式。如果你看一下吓人的图片,你可以清楚地看到日期不合适。该程序试图找到星期三,它应该找到的日期是星期二。

不幸的是,开发代码的不是我..

希望你们中的一些人能帮助我。

感谢您的宝贵时间

Screenshot to clarify

*%let aar = %eval( %sysfunc(year(%sysfunc(today())))-1); *Til brug ved årsskifte;

%let maaned_start= %eval( %sysfunc(month(%sysfunc(today())))-1);
%let maaned_slut=  %eval( %sysfunc(month(%sysfunc(today())))-1);
%let sidste_maaned=  %eval( %sysfunc(month(%sysfunc(today())))-2);

%put &=aar;
%put &=maaned_start;
%put &=maaned_slut;
%put &=sidste_maaned;

libname Trafik "\\sascortst01\SAS_dw\YouSee\Trafikdata";

data Trafik;
    input OLT_name $20. macaddress $14. Date1 $10. down_mbit up_mbit;
    date=input(date1,ddmmyy10.);
    format date ddmmyy10.;
    datalines;
    IdasOltprøveaaaaaaa aaaa-aaaa-aaaa 01/01/01 9999999 9999999
;
run;

data trafik (drop = date1);
retain OLT_name macaddress Date down_mbit up_mbit;
set trafik;
run;

%macro trafik (trafik);
%let aar = %eval( %sysfunc(year(%sysfunc(today()))));
%let maaned_start= %eval( %sysfunc(month(%sysfunc(today())))-1);
%let maaned_slut=  %eval( %sysfunc(month(%sysfunc(today())))-1);

%if &maaned_start. <= 9 %then %do;
  %do m=&maaned_start. %to &maaned_slut.;
  %do d=1 %to 9;
  proc sql;
  create table Trafik_mac_&aar.0&m.0&d._&trafik.
  as select distinct a.cmts_name as OLT_name, a.macaddress, b.lid, datepart(a.start_rec_creation_time) format ddmmyy10. as Date, round(sum(a.down_qos_service_octets_passed)*8/1000000,0.001) as down_mbit, 
  round(sum(a.up_qos_service_octets_passed)*8/1000000,0.001) as up_mbit 
  from trafik.Trafik_mac_&aar.0&m.0&d._&trafik. a left join trafik.Macaddress_info_&aar.0&m.0&d._&trafik. b on a.macaddress=b.macaddress
  group by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) order by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) desc;
  quit;
  proc sort data=Trafik_mac_&aar.0&m.0&d._&trafik. nodupkey; by OLT_name macaddress; run;
  data trafik;
  set trafik Trafik_mac_&aar.0&m.0&d._&trafik.;
  run;
%end;

%do d=10 %to 31;
proc sql;
create table Trafik_mac_&aar.0&m.&d._&trafik.
as select distinct a.cmts_name as OLT_name, a.macaddress, b.lid, datepart(a.start_rec_creation_time) format ddmmyy10. as Date, round(sum(a.down_qos_service_octets_passed)*8/1000000,0.001) as down_mbit, 
round(sum(a.up_qos_service_octets_passed)*8/1000000,0.001) as up_mbit 
from trafik.Trafik_mac_&aar.0&m.&d._&trafik. a left join trafik.Macaddress_info_&aar.0&m.&d._&trafik. b on a.macaddress=b.macaddress
group by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) order by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) desc;
quit;
proc sort data=Trafik_mac_&aar.0&m.&d._&trafik. nodupkey; by OLT_name macaddress; run;
data trafik;
set trafik Trafik_mac_&aar.0&m.&d._&trafik.;
run;
%end;
%end;
%end;

%if &maaned_slut. >= 10 %then %do;
%do m=&maaned_start. %to &maaned_slut.;
%do d=1 %to 9;
proc sql;
create table Trafik_mac_&aar.&m.0&d._&trafik.
as select distinct a.cmts_name as OLT_name, a.macaddress, b.lid, datepart(a.start_rec_creation_time) format ddmmyy10. as Date, round(sum(a.down_qos_service_octets_passed)*8/1000000,0.001) as down_mbit, 
round(sum(a.up_qos_service_octets_passed)*8/1000000,0.001) as up_mbit 
from trafik.Trafik_mac_&aar.&m.0&d._&trafik. a left join trafik.Macaddress_info_&aar.&m.0&d._&trafik. b on a.macaddress=b.macaddress
group by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) order by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) desc;
quit;
proc sort data=Trafik_mac_&aar.&m.0&d._&trafik. nodupkey; by OLT_name macaddress; run;
data trafik;
set trafik Trafik_mac_&aar.&m.0&d._&trafik.;
run;
%end;

%do d=10 %to 31;
proc sql;
create table Trafik_mac_&aar.&m.&d._&trafik.
as select distinct a.cmts_name as OLT_name, a.macaddress, b.lid, datepart(a.start_rec_creation_time) format ddmmyy10. as Date, round(sum(a.down_qos_service_octets_passed)*8/1000000,0.001) as down_mbit, 
round(sum(a.up_qos_service_octets_passed)*8/1000000,0.001) as up_mbit 
from trafik.Trafik_mac_&aar.&m.&d._&trafik. a left join trafik.Macaddress_info_&aar.&m.&d._&trafik. b on a.macaddress=b.macaddress
group by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) order by a.cmts_name, a.macaddress, datepart(a.start_rec_creation_time) desc;
quit;
proc sort data=Trafik_mac_&aar.&m.&d._&trafik. nodupkey; by OLT_name macaddress; run;
data trafik;
set trafik Trafik_mac_&aar.&m.&d._&trafik.;
run;
%end;
%end;
%end;

%mend trafik;
%trafik(MON);
%trafik(TUE);
%trafik(WED);
%trafik(THU);
%trafik(FRI);
%trafik(SAT);
%trafik(SUN);

data trafik (drop = month);
set trafik;
if OLT_name = "IdasOltpr%" then delete;
if macaddress = "aaaa-aaaa-aaaa" then delete;
Mont=month(date);
Year=year(date);
run;

【问题讨论】:

    标签: sas


    【解决方案1】:

    很难准确判断程序中发生了什么,但首先创建您需要的日期作为 SAS 日期。这可以通过intnx() 函数来更改您需要的日期。例如,如果您需要使用与今天完全相同的日期获取过去两个月的数据:

    %let today = %sysfunc(today() );
    
    %let start = %sysfunc(intnx(month, &today., -2) );
    %let end   = %sysfunc(intnx(month, &today., -1) );
    

    从那里,拉出每个单独的元素以构建文件名,例如年、月和日。使用 downame3. 格式获取 SAS 日期的工作日名称。例如:

    %let date    = %sysfunc(today() );
    %let weekday = %lowcase(%sysfunc(putn(&date., downame3.) ) );
    
    %let year    = %sysfunc(year(&date.) );
    %let month   = %sysfunc(month(&date.), z2.);
    %let day     = %sysfunc(day(&date.), z2.);
    
    %put Filename: trafik_mac_&year.&month.&day._&weekday.;
    

    输出:

    Filename: trafik_mac_20210921_tue
    

    【讨论】:

    • 我可以从你的创作方式中看出这个想法。但程序实际上正在运行。我喜欢的是不要在代码中改变太多。但是看看我是否可以重做星期几,让它运行程序并捕获正确的星期几,就像在屏幕截图中一样。所以这真的是关于我正在寻找的快速修复,因为我没有改变整个程序的技能。不过,不知道有没有可能。如果您可以在工作日制作-1,那么它需要星期二而不是星期三(屏幕截图)。但是感谢您的帮助:)
    • 似乎没有任何逻辑可以识别正确的工作日名称。例如,如果您在宏中选择指定“TUE”,则它不会检查您指定的工作日名称 - 它会遍历所有天,并且只获取与“TUE”匹配的数据。这将不可避免地导致程序出错,因为它无法找到所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多