วว จันทร์ ปปปป ถึง YYMMn6

ฉันกำลังเขียนโปรแกรมด้วย Proc SQL โปรแกรมรับไฟล์อินพุตต่าง ๆ โดยที่ชื่อไฟล์เปลี่ยนในแต่ละเดือน (เช่น myfile_YYYY_MM หรือ mytable_YYYYMM หรือ mydata_YY_M)

ขณะนี้โปรแกรมส่วนใหญ่เป็นแบบไดนามิก และผู้ใช้จะถูกขอให้ป้อนวันที่รายงานผ่านทางพรอมต์เมื่อรันโปรแกรม

"วันที่พร้อมท์" (&Rep_Date.) ในโค้ดมีรูปแบบ DD MON YYYY (31 พฤษภาคม 2018) และฉันต้องตั้งค่าตัวแปรมาโครหนึ่งตัวเพื่อแปลงค่านี้ให้อยู่ในรูปแบบ YYMMn6 (เช่น 201805)

ไวยากรณ์มีลักษณะดังนี้:

 %let Period = input("&Rep_Date."d,YYMMN.); 

วิธีนี้จะได้ผลเมื่อพยายามสร้างตัวแปร d9 และสำหรับการสร้างตัวแปรเดือน/ปี เช่นนี้

 %let date = "&Rep_Date."d; /*Last day execution month*/
 %let year = %sysfunc(year("&Rep_Date."d));
 %let month = %sysfunc(month("&rep_Date."d));

ด้วยเหตุผลบางประการ การดำเนินการเดียวกันนี้ใช้ไม่ได้เมื่อพยายามจัดรูปแบบวันที่เป็น YYMMn6

ฉันยังลองสร้างตัวแปร "Period" ในตาราง SAS ชั่วคราวเช่นนี้ แต่ก็ไม่มีโชคอีกครั้ง:

 Data dates; 
 Period = input((&Rep_date.,6.), yymmn6.);
 format Period yymmn6.;
 Run;

มีความคิดเห็นใดบ้างที่ฉันจะผิด?


person Joakim M. Viland    schedule 18.06.2018    source แหล่งที่มา
comment
เหตุใดจึงมีแท็ก SQL   -  person Richard    schedule 18.06.2018


คำตอบ (2)


ฉันเชื่อว่าปัญหาเกิดจากการที่คุณใช้เพียงฟังก์ชัน input ในคำสั่ง %let ของคุณ.. สิ่งนี้จะไม่แก้ไขอย่างถูกต้อง สิ่งที่ถูกต้องคือการใช้ฟังก์ชันมาโคร %sysfunc กับฟังก์ชัน input ปัญหาคือ sysfunc ใช้งานไม่ได้กับฟังก์ชันอินพุต ดังนั้น วิธีแก้ไขคือใช้ %sysfunc(putn()) นี่คือตัวอย่าง

แก้ไข: ไม่แน่ใจว่าคุณกำลังพยายามทำอะไร แต่ฟังก์ชัน %window (สมมติว่าคุณใช้ Windows) ช่วยให้คุณสามารถรับอินพุตผ่านพรอมต์แล้วสร้างตัวแปรแมโครจากอินพุต นี่คือตัวอย่าง:

%global Period;

%window info
  #5 @5 'Please enter date:'
  #5 @40 _Date 9 attr=underline;
%display info;
%put &_Date.;


%macro da(Rep_Date=&_Date);
%let Period = %sysfunc(putn("&Rep_Date."d,YYMMN.)); 
%put &Period.;
%mend;

%da();

สิ่งนี้ควรจะได้ผล

person John Doe    schedule 18.06.2018
comment
สวัสดี JD ใช้งานได้ แต่ฉันกำลังพยายามทำให้อินพุตสำหรับตัวแปร Period เป็นอินพุตจากหน้าต่างพร้อมท์วันที่ มีวิธีสร้าง %da(Rep_Date = &Rep_Date.) หรือไม่ ลองใช้เครื่องหมายคำพูด ฯลฯ ไม่ต้องการทำงาน! - person Joakim M. Viland; 18.06.2018
comment
ฉันอัปเดตคำตอบแล้ว แจ้งให้เราทราบหากจะช่วยแก้ปัญหาของคุณได้ - person John Doe; 18.06.2018

เกิดอะไรขึ้น? คุณกำลังผสมบริบทและตีความการเป็นตัวแทนในทางที่ผิด (ตามตัวอักษร - ตั้งใจสื่อความหมายตามตัวอักษร)

พูดสั้นๆ

ให้โค้ดมาโครของคุณใช้ค่าแสดงวันที่เป็นพื้นฐานสำหรับค่าตัวอักษรที่ใช้ใน putN() ที่เรียกใช้โดย %sysfunc

%let Rep_Date = 18-JUN-2018; * some date representation;
%let Period = %sysfunc(PUTN("&Rep_Date."D,YYMMN.));
%put NOTE: Period=%superq(Period);

ในระยะยาว

จากอภิธานศัพท์ใน "วิธีใช้และเอกสารของ SAS" (F1)

  • ค่าวันที่ของ SAS
    จำนวนเต็มที่แสดงวันที่ในซอฟต์แวร์ SAS จำนวนเต็มแสดงถึงจำนวนวันระหว่างวันที่ 1 มกราคม 1960 และวันที่ระบุอื่น ตัวอย่างเช่น ค่าวันที่ SAS 366 แสดงถึงวันที่ตามปฏิทินวันที่ 1 มกราคม 1961

  • ค่าคงที่วันที่ของ SAS
    สตริงในรูปแบบ 'ddMMMyy'd หรือ 'ddMMMyyyy'd ที่แสดงวันที่ในคำสั่ง SAS สตริงอยู่ในเครื่องหมายคำพูดและตามด้วยอักขระ d (เช่น '6JUL01'd, '06JUL01'd, '6 JUL2001'd หรือ '06JUL2001'd)

  • รูปแบบวันที่และเวลา
    คำแนะนำที่บอก SAS ถึงวิธีการเขียนค่าตัวเลขเป็นวันที่ เวลา และเวลาวันที่

  • ข้อมูลวันที่และเวลา
    คำแนะนำที่บอก SAS ถึงวิธีการอ่านค่าตัวเลขที่แสดงเป็นวันที่ เวลา และเวลาวันที่

ค่าข้อความในรูปแบบ DD MON YYYY เป็นรูปแบบหนึ่งของการแสดงวันที่ สามารถป้อนแบบฟอร์มที่มีตัวเลขสี่ปีได้โดยใช้คำแนะนำที่มีอยู่ในข้อมูล DATE11. ตัวอักษรวันที่ของ SAS (ค่าคงที่วันที่ของ SAS) อยู่ในรูปแบบ DDMONYYYYD โดยมีหรือไม่มีการเว้นวรรค ขีดกลาง เครื่องหมายทับ ฯลฯ ที่หลากหลาย

โค้ดรูปแบบอื่นที่คล้ายกับ 'โดยย่อ' จะป้อนข้อความวันที่โดยใช้รูปแบบเฉพาะ (date11.) แทนที่จะอาศัยระบบในการตีความตามตัวอักษรของวันที่

%let Rep_Date_text_representation = 18/JUN/2018;
%let Rep_Date_value = %sysfunc(inputN(&Rep_Date_text_representation,date11.));
%let Period = %sysfunc(putn(&Rep_Date_Value,yymmn.));

%put NOTE: &=Rep_Date_text_representation ;
%put NOTE: &=Rep_Date_value;
%put NOTE: &=Period;
person Richard    schedule 18.06.2018