Base SAS中的日期格式

Base SAS中的日期格式,sas,base,Sas,Base,我必须在where类中传递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查询中使用相同的日期?在许多

我必须在where类中传递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查询中使用相同的日期?

在许多情况下,
anyDTM
可以作为参考信息,但是,正如您在评论中指出的,问题中提供的日期时间格式并非如此

使用
cats
scan

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)

我使用了子字符串。我在数据集中创建了一个新列new_DATE。如上所述,日期格式为2018年3月17日01:01:01星期六。以下是以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;
然后在procsql中使用新列

proc sql;
select * from new where new_date_updated>'17-Mar-2018'd;
quit;
这对我很有效

谢谢


检查上述所有场景的方法,可以很好地处理所有

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

 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;

日志中显示了哪些错误?“日期”列的属性(类型、长度、格式、信息、标签)是什么?您能说明如何在Proc SQL中“使用相同的”吗?列是stringMinor quibble。SAS以秒为单位存储日期时间值,而不是以毫秒为单位。代码中的日期时间不正确。应该是2018年3月18日:05:17:00,而不是2001年3月18日:05:17:00。在你们的产出中,2001年将取代2018年。这只在3月份的几天内有效。April在词汇上是在March()之前,因此带有新的_日期的行对应于4月份的天,例如'01-APR-2018',将解析为小于'17-MAR-2018',并且不被选择Edit将与给出答案一样工作,但这是一个文本比较,因此它将按字母顺序排列,不是数字,因此与您发布的内容和您声明的内容的比较不应该是正确的。
 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;