【问题标题】:SAS: converting a datetime to date in where clauseSAS:在where子句中将日期时间转换为日期
【发布时间】: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 格式? 对此的任何帮助将不胜感激

【问题讨论】:

    标签: sas


    【解决方案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)。

    【讨论】:

    • 有点不同的是,比较两个日期时间值需要日期和时间相等,而不仅仅是日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多