我在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中投放datetime
到date9
格式?
任何有关这方面的帮助将不胜感激
答案 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)。