Base SAS 中的日期格式

Date Format in Base SAS

我必须在 Class.

中的 Proc SQL 中传递日期格式

日期格式是这样的"SAT Mar 17 01:29:17 IST 2018"(字符串列,长度为28)

现在,当我尝试输入(Date,datetime18.) 和其他一些日期函数时,都出现错误。下面是我的查询

proc sql;
Select input(Date,datetime18.) from table;
quit;

如何将此日期转换为像“17-03-2018”这样的简单日期,以便我可以在 proc SQL 查询中使用相同的日期?

在许多情况下,ANYDTDTM 可以成为信息格式,但是,正如您(在评论中)指出的那样,问题中显示的日期时间格式并非如此。

可以使用 catsscan

将字符串重新排列为 SAS 可输入日期时间表示
data have;    
  date_string = "SAT Mar 17 01:29:17 IST 2018";    
run;

data want;
  set have;

  dt_wrong = input(date_string, anydtdtm.);

  dt_right = input ( cats 
          ( scan(date_string,3),
            scan(date_string,2),
            scan(date_string,6),':',
            scan(date_string,4)
          ), datetime20.);

  put date_string= /;
  put dt_right= datetime20. " from input of cats of string parts";
  put dt_wrong= datetime20. " from anydttm ";
run;

* sample macro that can be applied in data step or sql;

%macro dts_to_datetime(dts);
  input ( cats 
          ( scan( &dts , 3),
            scan( &dts , 2),
            scan( &dts , 6), ':',
            scan( &dts , 4)
          )
        , datetime20.)
%mend;

data want2;
  set have;
  dt_righton = %dts_to_datetime(date_string);

  format dt_righton datetime20.;

  put dt_righton=;
run;

宏也可以用在where语句中,例如

where '18-Mar-2018:0:0'DT <= %dts_to_datetime (date_string)

或SQL

, %dts_to_datetime (date_string) as event_dtm format=datetime20.

我使用 sub-string.I 在数据集中创建了一个新列 NEW_DATE。如上所述,日期格式为 Sat Mar 17 01:01:01 IST 2018。以下是获取日期格式为 DD-MMM-YYYY

的数据步骤
data new;
set old;
new_date = substr(date,9,2)||"-"||substr(date,5,3)||"-"||substr(date,25,4);
new_date_updated = input(new_date,date11.);
format new_date_updated date11.;
run;

然后我在 proc sql

中使用新列
proc sql;
select * from new where new_date_updated>'17-Mar-2018'd;
quit;

它对我有用。

谢谢

在所有情况下检查了上述方法,在所有情况下都可以正常工作

日期是数字,你不应该将它与字符串值进行比较,通过将你的值也转换为日期来将它与日期文字进行比较。将大于和小于值与字符串进行比较,通常没有任何用处,并且可能导致错误的结果。比较数值变量时,小于和大于具有 meaning/make 意义

 data have;
 b = "SAT Mar 17 01:29:17 IST 2018";
 output;
 b= "SAT Mar 19 01:29:17 IST 2018";
output;
 b= "SAT Jun 20 01:29:17 IST 2018";
output;
b= "SAT Mar 25 01:29:17 IST 2018";
output;
run;


proc sql;
select * from have
where input(cats(scan(b,3),scan(b,2), scan(b, -1)),date9.) > "19Mar2018"d;