Date 使用ISO 8601符号创建自定义SAS日期时间格式

Date 使用ISO 8601符号创建自定义SAS日期时间格式,date,datetime,sas,format,iso,Date,Datetime,Sas,Format,Iso,我在SAS表中有一个字符变量,它填充了一种不常见的日期时间类型。实际上,它的格式如下:YYYY-MM-DDT00:00:00.000+00:00。下面是一个示例:2020-01-01T00:00:00 我想将此字符列转换为日期列。我一直在文档中搜索相关格式,但没有找到正确的格式 我找到了$E8601DZ.(),其结果例如:2020-01-01T00:00:00+00.00(注意.000在秒后丢失)和$E8601DTw.d(),其结果例如:2020-01-01T00:00:00.000(注意+00

我在SAS表中有一个字符变量,它填充了一种不常见的日期时间类型。实际上,它的格式如下:
YYYY-MM-DDT00:00:00.000+00:00
。下面是一个示例:
2020-01-01T00:00:00

我想将此字符列转换为日期列。我一直在文档中搜索相关格式,但没有找到正确的格式

我找到了
$E8601DZ.
(),其结果例如:
2020-01-01T00:00:00+00.00
(注意
.000
在秒后丢失)和
$E8601DTw.d
(),其结果例如:
2020-01-01T00:00:00.000
(注意
+00:00
丢失)

因此,是否有可能“混合”这两种格式,生成一种自定义格式,以创建具有所需格式的日期变量

SAS代码

data example;
   date="2020-01-01T00:00:00.000+00:00";
run;

您可以声明您有一个字符变量,其中包含日期时间表示形式的值

您链接到的格式不是字符格式,因此将以
$
开头。按文档格式

写入零子午线的日期时间值

Datetime值基本上是数字

您可能需要执行
输入
,将字符值转换为实际的SAS日期时间值(数字秒从历元
01jan1960T0:0:0
),然后对接收日期时间值的变量应用ISO日期时间格式

例如:

data have;
  my_datetime_string = '2020-01-01T00:00:00';
run;

data want;
  set have;
  my_sas_datetime = input (my_datetime_string, E8601DT.);
  my_sas_datepart = datepart(my_sas_datetime);

  format my_sas_datetime datetime19.;
  format my_sas_datepart date9.;
run;

proc print data=want;
run;

只需使用正确的信息读取数据,并使用正确的格式写入数据即可。如果偏移量始终为零,则使用E8601DZ格式/信息。要包含小数点后三位,请确保指定这是您想要的。生成的字符串的总宽度为29个字符,其中3个位于小数点的右侧,因此请使用
e8601dz29.3
格式规范。您不希望在信息中包含小数点宽度,因为信息中小数点的含义不同于格式,因此请使用
e8601dz29.
作为信息规范

data example;
   string="2020-01-01T00:00:00.000+00:00";
   datetime=input(string,e8601dz29.);
   format datetime datetime19.;
   string2=put(datetime,e8601dz29.3);
   put (_all_) (=/);
run;
结果:

string=2020-01-01T00:00:00.000+00:00
datetime=01JAN2020:00:00:00
string2=2020-01-01T00:00:00.000+00:00