基本SAS中的日期格式

时间:2019-01-18 08:15:39

标签: sas base

我必须在Proc SQL中的where类中传递日期格式。

日期格式类似于“ 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查询中使用相同的日期?

3 个答案:

答案 0 :(得分:1)

在许多情况下,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.

答案 1 :(得分:1)

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

 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;

答案 2 :(得分:-1)

我使用了子字符串。我在数据集中创建了一个新列NEW_DATE。如上所述,日期格式为 IST 3 Mar 17 01:01:01 IST 。以下是获取日期的数据步骤,格式为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;

对我有用。

谢谢

在所有情况下都经过上述方法的检验,可以在所有情况下正常工作