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子句中将日期时间转换为日期的主要内容,如果未能解决你的问题,请参考以下文章

SQL在where子句中转换日期格式

在 where 子句中将字符串更改为日期时间格式以进行比较

如何在SAS(大学)中将char字符转换为日期?

将行转换为涉及日期的列

如何在sybase中将字符串转换为日期

将日期转换放在where子句db2 sql中