sas - SAS 日期转换
问题描述
我有以下带有 yymmn6 的宏变量。格式。
%let a=201501;
我想有一个新的宏变量 b 基于宏 a 和 '2015-01-01'(teradata 格式)。这样我就可以在 where 条件下调用宏 b
我尝试了以下代码。
%let b=%sysfunc(put(&a.,year4.)||'-'||put(&a,month2.)||'-01'||"'");
%put &b.
结果:OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;错误:未找到宏函数调用后预期的右括号。61
62
63 %let b=%sysfunc(put(&a.,year4.)||'-'||put(&a,month2.)||'-01'||"'"); 64%看跌期权。65
%let b=%sysfunc(putn(&a.,yymmn6.),yymmdd10.);
结果:
%let b=%sysfunc(putn(&a.,yymmn6.),yymmdd10.); 64%看跌期权。65
66 选项NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;251203 选项注释 NOSTIMER NOSOURCE NOSYNTAXCHECK
%let a=201501;
data _null_;
date=input("&a.",yymmn6.);
call symput('date1' , "'"||put(date,year4.)||'-
'||put(date,month02.)||'-01'||"'");
run;
%put &date1.;
对于上述数据null得到的结果是
68%看跌&date1.; '2015-1-01'
所以我想做的就是将 201501 转换为 2015-01-01 并希望使用不在调用符号中的 %let 宏来解决
解决方案
您可以使用将您的月份表示yyyymm转换为yyyy-mm-01
%sysfunc
不需要数据步骤并调用函数inputn
和putn
inputn
将月份表示形式转换为 sas 日期值putn
将 sas 日期值转换为yyyy-mm-dd表示
例子
%let month = 201501;
%let fom_date = %sysfunc(inputn(&month,yymmn6.));
%let fom_ymd = %sysfunc(putn(&fom_date,yymmdd10.));
%put &=month;
%put &=fom_date;
%put &=fom_ymd;
作为一个宏,它对发出的表示进行单引号,以便成为 Teradata 日期文字。
%macro ymn_to_tddl (month);
%* emit teradata date literal corresponding to month;
%* month - month representation as yyyymm;
%str(%')%sysfunc(putn(
%sysfunc(inputn(&month,yymmn6.))
,yymmdd10.
))%str(%')
%mend;
%put %ymn_to_tddl (201501);
- - 日志 - -
'2015-01-01'
推荐阅读
- c# - 如何使用带有构造函数参数的类注册依赖注入
- xcode - 带有 Cloud Firestore 的 SwiftUI 选择器
- oracle - 显示使用 pl/sql 删除的行数
- x86-64 - 带符号的 avx512 vnni 乘法
- sql-server - 将此“2020-10-19T12:19:04+0530”字符串转换为日期或日期时间
- ruby - 多次出现相同的锚标记字符串
- ruby-on-rails - 如何在 ruby 中使用 select_tag 和 submit_tag?
- amazon-dynamodb - DynamoDB 密钥设计
- python - python:从两个字典中排除公地
- android - Android ItemTouchHelper onChildDraw 让itemView回到原来的位置