【问题标题】:SAS Date FunctionsSAS 日期函数
【发布时间】:2012-08-21 03:41:11
【问题描述】:

我有一个 SAS 数据集,其中名为ISSUE_DATE 的列之一是文本类型,并且具有'YYYYMMDD' 格式的日期值。我正在针对此数据集编写查询,并希望检索 ISSUE_DATE

SELECT * FROM WORK.DATASET WHERE ISSUE_DATE <= today()-2. 

我是 SAS 新手,不太了解日期函数和转换。非常感谢任何帮助。

谢谢

【问题讨论】:

  • 可能值得注意的是,无论您使用哪种方法,任何缺少的日期值都将被返回,因为它们将被视为

标签: sas


【解决方案1】:

您需要使用 INPUT 函数和相关信息将数据类型转换为数字,以便 SAS 识别日期。您可以在 WHERE 子句中执行此操作,这样可以节省创建额外列的时间。所以您的查询将如下所示:

SELECT * FROM WORK.DATASET WHERE INPUT(ISSUE_DATE,YYMMDD8.)

【讨论】:

    【解决方案2】:

    跟进基思的回答,这样做可能更有效:

    SELECT * 
    FROM   WORK.DATASET 
    WHERE  ISSUE_DATE <= PUT( today()-2 , YYMMDDN8.)
    

    这将使 SAS 不必在每次观察时运行 INPUT 函数。

    【讨论】:

    • 我在这里可能很愚蠢(或者只是对如何优化 WHERE 子句缺乏了解),但是您的解决方案不是在每次观察时都运行 PUT 函数吗?我想一种选择是将值 TODAY-2 存储在宏变量中并引用它。我选择转换为数字,因为匹配数字比匹配字符更有效,并且比较存储为数字的日期更安全。指定的格式是唯一可以在存储为字符时起作用(使用
    • 我认为您的解决方案中缺少 &lt;= 运算符。
    • 哎呀,你是对的。我应该说使用YYMMDDN8。格式以匹配数据。是的,它应该是
    • 另外,使用 WHERE 子句右侧的 PUT 函数应该允许 SAS 将该表达式识别为常量,这样与执行 INPUT 函数相比,PUT 函数只执行一次对于数据中的每个 obs。
    • 大家好,感谢您的回答。今天早上发生了变化,ISSUE_DATES 格式更改为 "DDMONYY:HH:MM:SS" ,我猜这是 datetime20。所以我使用了以下查询 SELECT * FROM WORK.DATASET WHERE DATEPART(ISSUE_DATE)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多