DD SENIN YYYY ke YYMMn6

Saya sedang menulis program di Proc SQL. program ini mengambil berbagai file input, yang nama filenya berubah dari bulan ke bulan (yaitu myfile_YYYY_MM atau mytable_YYYYMM, atau mydata_YY_M).

Sebagian besar program sekarang bersifat dinamis, dan pengguna diminta memasukkan tanggal pelaporan melalui prompt saat menjalankan program.

"Tanggal Segera" (&Tanggal_Rep.) dalam kode memiliki format DD MON YYYY (31 Mei 2018), dan saya perlu menyiapkan satu variabel makro yang mengubah nilai ini ke format YYMMn6 (yaitu 201805).

Sintaksnya terlihat seperti ini:

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

Ini berfungsi ketika mencoba membuat variabel d9, dan untuk membuat variabel bulan/tahun, seperti ini:

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

untuk beberapa alasan, hal yang sama tidak berfungsi saat mencoba memformat tanggal ke YYMMn6.

Saya juga mencoba membuat variabel "Periode" di tabel SAS sementara seperti ini, tetapi sekali lagi tidak berhasil:

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

Adakah ide tentang kesalahan saya?


person Joakim M. Viland    schedule 18.06.2018    source sumber
comment
Mengapa ini memiliki tag SQL?   -  person Richard    schedule 18.06.2018


Jawaban (2)


Saya yakin masalahnya adalah karena Anda hanya menggunakan fungsi input dalam pernyataan %let Anda.. Ini tidak akan terselesaikan dengan benar. Hal yang benar adalah menggunakan fungsi makro %sysfunc dengan fungsi input. Masalahnya adalah sysfunc tidak berfungsi dengan fungsi input. Oleh karena itu, solusinya adalah dengan menggunakan %sysfunc(putn()). Ini sebuah contoh.

Sunting: Tidak yakin apa yang ingin Anda capai tetapi fungsi %window (dengan asumsi Anda menggunakan Windows) memungkinkan Anda mengambil masukan melalui prompt dan kemudian membuat variabel makro dari masukan tersebut. Berikut ini contohnya:

%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();

Ini seharusnya berhasil.

person John Doe    schedule 18.06.2018
comment
Hai JD, Berhasil, tetapi saya mencoba menjadikan input untuk variabel Periode menjadi input dari jendela prompt tanggal. Apakah ada cara untuk membuat %da(Rep_Date = &Rep_Date.)? mencoba tanda kutip, dll. tidak mau berhasil! - person Joakim M. Viland; 18.06.2018
comment
Saya memperbarui jawabannya. Beri tahu saya jika ini menyelesaikan masalah Anda. - person John Doe; 18.06.2018

Apa yang salah? Anda mencampurkan konteks dan salah mengartikan representasi sebagai representasi literal (secara harfiah - permainan kata-kata yang dimaksudkan secara harfiah).

Singkatnya

Minta kode makro Anda menggunakan nilai representasi tanggal sebagai dasar untuk nilai literal yang digunakan dalam putN() yang dipanggil oleh %sysfunc.

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

Dalam Panjang

Dari Glosarium di "Bantuan dan Dokumentasi SAS" (F1)

  • Nilai tanggal SAS
    bilangan bulat yang mewakili tanggal dalam perangkat lunak SAS. Bilangan bulat mewakili jumlah hari antara 1 Januari 1960 dan tanggal tertentu lainnya. Misalnya, nilai tanggal SAS 366 mewakili tanggal kalender 1 Januari 1961.

  • Konstanta tanggal SAS
    string dalam bentuk 'ddMMMyy'd atau 'ddMMMyyyy'd yang mewakili tanggal dalam pernyataan SAS. String diapit tanda kutip dan diikuti dengan karakter d (misalnya, '6JUL01'd, '06JUL01'd, '6 JUL2001'd, atau '06JUL2001'd).

  • Petunjuk format tanggal dan waktu
    yang memberi tahu SAS cara menulis nilai numerik sebagai tanggal, waktu, dan waktu.

  • informasi tanggal dan waktu
    instruksi yang memberi tahu SAS cara membaca nilai numerik yang direpresentasikan sebagai tanggal, waktu, dan waktu.

Nilai tekstual berbentuk DD MON YYYY merupakan salah satu bentuk representasi suatu tanggal. Formulir dengan angka empat tahun dapat dimasukkan menggunakan instruksi yang ada pada informasi DATE11.. Literal tanggal SAS (konstanta tanggal SAS) berbentuk DDMONYYYYD dengan atau tanpa variasi spasi, tanda hubung, garis miring, dll.

Variasi kode lain yang mirip dengan 'Singkatnya' akan memasukkan teks tanggal menggunakan format tertentu (date11.) alih-alih mengandalkan sistem yang melakukan interpretasi literal tanggal.

%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