【问题标题】:Reading/using format YYYYMMDD and "0" values in date field在日期字段中读取/使用格式 YYYYMMDD 和“0”值
【发布时间】:2015-05-20 15:52:56
【问题描述】:

我们有一个正在更改的系统提要...当前是儒略日期,并且正在转换为 YYYYMMDD——尽管对于空白值,它们输入的是“0”。不确定它的格式是什么...

首先,我通过执行“if XXXfield = 0 then XXXfield = ' ' 来取出 0,这会为该记录返回一个“.”。然后我尝试使用“format XXXfield YYMMDD8”进行编码。任何东西都返回空白有日期。我不是在创建表格,只是将其读入....我怎样才能成功地将日期设置为没有空白“0”值的日期以及我可以在 SAS 中使用的格式( ie XXXfield >= Xdate)?? 提前感谢您的建议!

样本数据(1 个空白,4 个带值):

reporting_date
0
20141122
20130604
20130626
20140930

【问题讨论】:

  • 您希望“0”日期发生什么?您如何将其读入 SAS - 这是来自数据库、文本文件还是其他什么?
  • 我希望“0”日期最终为空白。我正在从我们服务器上的 SAS 数据集中读取它。
  • 最初,数据是从销售系统推送的,这种格式是他们可以发送给我们的格式。
  • @BellyDanceCostumes,当您即将发布下一个问题时,您可以记住一些提示。 1.把自己放在读者的位置,确保自己能够理解你的问题。 2. 确保您的问题中有一个工作数据集,例如我在下面发布的data work.have;。 3. 确保添加到目前为止您尝试过的实际代码。这三个将帮助您更快地得到答案。

标签: date format sas


【解决方案1】:

reporting_date 的格式是BEST12.,根据您在下面的评论。

data work.have;
input reporting_date BEST12.;
datalines;
0
20141122
20130604
20130626
20140930
;
run;

因此,让 SAS 将 reporting_date 解释为实际日期的一种方法是将其临时格式化为字符串,然后将其转换为 YYMMDD10. 作为格式。

proc sql;
  create table work.want as
   select input(put(t1.reporting_date, 8.), YYMMDD10.) format=YYMMDDn8. as reporting_date
   from work.have t1;
;
run;

在这种情况下,

  • put 将其转换为以八个字符为宽度的字符串,
  • input 会将字符串转换为实际的 SAS 日期,并且
  • format 将以人类可读的方式显示日期。

第三个项目符号是可选的,format 的值只是许多可用的date and time formats 之一。转换还会处理以 0 为值的行并将它们转换为缺失 (.)。

现在,当您将该列作为 SAS 日期时,您就可以对其进行过滤了:

proc sql;
create table work.filter as
  select t1.reporting_date
  from work.want t1
  where t1.reporting_date > '01JUL2013'd
;
run;

但是,您不应采取这些变通办法,而应考虑更改将本列读入 SAS 数据集的作业中的格式。

【讨论】:

  • 感谢您的建议。我没有使用输入语句,因为我正在从现有数据集中读取记录。我在这个数据集中有超过一百万条记录,因此每次通过输入语句读取每条记录是不可行的。这是我到目前为止测试的代码....它不起作用....所有日期都是空白的。
  • 这会从位于我们的 SAS 服务器上的数据集中读取数据,直接馈送...无输入,不会创建新的数据集。数据测试;设置 k.test_dates;如果 actual_end_date = 0 那么 actual_end_date = ' ';跑;数据测试1;设置测试;格式reporting_date yymmdd8.;运行;
  • 能否请您运行以下代码:PROC SQL; CREATE TABLE WORK.QUERY_FOR_VCOLUMN AS SELECT t1.name, t1.type, t1.format FROM SASHELP.VCOLUMN t1 WHERE t1.libname = 'K' AND t1.memname = 'TEST_DATES' AND t1.name = 'ACTUAL_END_DATE';退出;运行;
  • 并将结果发布到 cmets。
  • 我得到 0 行和 3 列名为“名称、类型和格式”。它指向正确的libname,数据集名为test_dates,字段存在名为actual_end_date。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多