SAS:在where子句中将日期时间转换为日期
Posted
技术标签:
【中文标题】SAS:在where子句中将日期时间转换为日期【英文标题】:SAS: converting a datetime to date in where clause 【发布时间】:2015-07-08 20:20:50 【问题描述】:我在日期时间 25.6 格式的 sas 数据集中有一列;让我们将此列称为日期时间。我想在 where 子句中将其转换为 Date9 格式并检查某个日期或日期变量。
我目前有以下代码:
proc sql;
Select rowid, name, dob, country
from db.testTable
where cast(datetime as date9.) eq '14sep2014'd
;
quit;
运行上述代码时出现错误:
错误 22-322:语法错误,应为以下之一:!, !!, &, ), *, **, +, ',', -, /, , = , >, >=, ?, AND, BETWEEN, 包含,EQ,EQT,GE,GET,GT,GTT,IN,IS,LE,LET,LIKE,LT,LTT,NE,NET,NOT,NOTIN,OR,^,^=,|,||,~, 〜=。
错误 202-322:选项或参数无法识别,将被忽略。
如果使用以下内容,我会收到相同的错误消息
proc sql;
Select rowid, name, dob, country
from db.testTable
where cast(datetime as date9.) = '14sep2014'd
;
quit;
有没有更好的方法在 SAS 中将 datetime
转换为 date9
格式?
对此的任何帮助将不胜感激
【问题讨论】:
【参考方案1】:在 SAS 中,您将使用 datepart()
函数从日期时间值中提取日期值:
where datepart(datetime) = '14sep2014'd
不需要指定格式,因为它不会影响基础值。
【讨论】:
感谢这个 DWAL,这对我有用,我能够使用 datepart() 提供日期,SAS 为我生成了一个结果数据集。感谢您的快速反馈。【参考方案2】:第二个选项,这无疑比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)。
【讨论】:
有点不同的是,比较两个日期时间值需要日期和时间相等,而不仅仅是日期。以上是关于SAS:在where子句中将日期时间转换为日期的主要内容,如果未能解决你的问题,请参考以下文章