SAS:在where子句中将日期时间转换为日期

时间:2015-07-08 20:20:50

标签: sas

我在sas数据集中有一个日期为25.6格式的列;我们称这个列为datetime。我想在where子句中将其转换为Date9格式,并检查某个日期或日期变量。

我目前有以下代码:

proc sql;
Select rowid, name, dob, country
from db.testTable
where cast(datetime as date9.) eq '14sep2014'd
;
quit;

运行上述代码时出错:

  

错误22-322:语法错误,需要以下其中一项:!,!!,&,),*,**,+,',', - ,/,<,< =,&lt ;>,=,>,> =,?,AND,BETWEEN,                 CONTAINS,EQ,EQT,GE,GET,GT,GTT,IN,IS,LE,LET,LIKE,LT,LTT,NE,NET,NOT,NOTIN,OR,^,^ =,|,||,〜, 〜=。

     

ERROR 202-322:无法识别选项或参数,将被忽略。

如果使用以下

,我会收到相同的错误消息
proc sql;
Select rowid, name, dob, country
from db.testTable
where cast(datetime as date9.) = '14sep2014'd
;
quit;

有没有更好的方法在SAS中投放datetimedate9格式? 任何有关这方面的帮助将不胜感激

2 个答案:

答案 0 :(得分:4)

在SAS中,您可以使用datepart()函数从日期时间值中提取日期值:

where datepart(datetime) = '14sep2014'd

无需指定格式,因为它不会影响基础值。

答案 1 :(得分:1)

第二个选项,毫无疑问会比datepart略逊一筹,除非你有一个真正的大数据集(其中它有点快,因为你有一个(希望)常数表达式的一边而不是每次迭代的函数调用,是使用DHMS来创建日期时间:

data _null_;
  x=dhms('01JAN2010'd,0,0,0);
  put x=;
run;

甚至明确使用日期时间常量:

data _null_;
  x='01JAN2010:00:00:00'dt;
  put x=;
run;

(我希望它们具有相同的时序,因为SAS应该优化第一个到第二个,因为它是一个恒定的表达式 - 但谁知道)。

另一方面,SAS有两种原始类型:数字和字符。 input将字符转换为数字,put将数字转换为字符 - 相当于cast。 SAS中的任何其他内容(例如日期)都只是应用于数字(或字符)的格式,并且具有自己的特殊功能(如此处的datepart)。