Datetime 是否将日期戳添加到SAS 9.1.3文件名?

Datetime 是否将日期戳添加到SAS 9.1.3文件名?,datetime,sas,filenames,Datetime,Sas,Filenames,首先,我要说的是,我对SAS的经验很少。我正在Windows中使用SAS 9.1.3。在这件事上我别无选择 我需要将SAS传输(XPT)文件命名为格式为“CR845\u CLIN2001\u LB\u Date\u Time.XPT”。目前,我有一个脚本,它只使用日期命名(sysdate9) 使用日期的代码行如下所示-我认为这些代码行需要更改-它们并不都在一个块中: libname XPORTOUT xport "\\ACMSHARES2\CLNTRIAL\DataMgt\C1845\DataT

首先,我要说的是,我对SAS的经验很少。我正在Windows中使用SAS 9.1.3。在这件事上我别无选择

我需要将SAS传输(XPT)文件命名为格式为“CR845\u CLIN2001\u LB\u Date\u Time.XPT”。目前,我有一个脚本,它只使用日期命名(sysdate9)

使用日期的代码行如下所示-我认为这些代码行需要更改-它们并不都在一个块中:

libname XPORTOUT xport "\\ACMSHARES2\CLNTRIAL\DataMgt\C1845\DataTransfer\Data\Sent\SAS\CR845_CLIN2001_LB_&sysdate9..xpt";

data LabData.&fileBaseName._&sysdate9 (COMPRESS=YES);

data LB.LB; 
    set LabData.&fileBaseName._&sysdate9; 
run;

proc contents data = LabData.&fileBaseName._&sysdate9 varnum;
run;

我试过几次,但是SAS拒绝使用冒号。有人能帮我吗?提前谢谢

Windows文件名中不允许使用冒号。使用更好的格式,例如我的个人偏好:

然而,对于9.1.3,B8601DT(和其他IEEE日期格式)不受支持,因为它大约有15年历史了。。。你必须想出另一个更零碎的解决方案


我在这里的偏好是以秒为单位表示时间,这将使文件名仍然能够唯一(并正确排序)。分割日期和时间。我假设您在这里使用
&sysdate9
是可以接受的(这是SAS开始的日期,不是今天的日期,但如果这是批处理作业,就可以了);但我仍然使用
%today()
而不是
&systime
,因为它更容易快速格式化。

好吧,我拼凑了一个非常糟糕的解决方案。它是有效的,但它是丑陋的罪恶。我又添了一个烂摊子:

%let cyear=%sysfunc(putn("&sysdate9"d, year4.));
%let cmon =%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TODAY())),DATE9.)),3,3);
%let cday =%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TODAY())),DATE9.)),1,2);
%let chour=%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TIME())),TIME5.)),1,2);
%let cmin=%SUBSTR(%SYSFUNC(PUTN(%sysevalf(%SYSFUNC(TIME())),TIME5.)),4,2);
然后在我的原始问题中显示的代码行中,将其替换为“sysdate9”:

&cyear&cmon&cday._&chour&cmin

这很有效,但我讨厌它。欢迎光临

这对你来说可能有些过分,但其他人可能会觉得这很有用。在SAS中,当您发现缺少现有的日期时间格式时,可以创建自己的日期时间格式

一份好的白皮书

下面是一个创建您试图实现的格式的示例:

proc format;
  picture myfmt low-high = '%Y%0m%0d_%0H%0M' (datatype = datetime) ;
run ;
用法示例:

%put %sysfunc(datetime(), myfmt.);
给出:

20150819_1304

如果要添加秒,则其标记为:
%0S

生成一个带有所需后缀的宏变量。我建议使用YYYYMMDD_HHMM格式,因为它将正确排序。然后,在生成XPORT文件名时,使用新的宏变量代替&SYSDATE9

%let dt=%sysfunc(today(),yymmddn8)_%sysfunc(compress(%sysfunc(time(),time5),:));
libname XPORTOUT xport "\\....\CR845_CLIN2001_LB_&dt..xpt";

如果要包含秒,请使用TIME8而不是TIME5格式。

因为冒号是问题所在,您可以使用压缩功能删除它们,我相信SAS 9.1.3中确实存在压缩功能。不漂亮,但又快又有效

%let today=%sysfunc(datetime(), datetime21.);
%let today=%sysfunc(compress(&today, :));
%put &today;
2015年8月19日1413

还有另一种让T进去的方法

data _null_;
date=put(datetime(), datetime21. -l);
substr(date, 10, 1)="T";
date=compress(date, ":");
call symputx('date_value', date);
run;

%put &date_value;
2015年8月19日T141801


不是SAS拒绝使用冒号。是窗户。冒号在文件名中无效;在Windows上,它是一个驱动器分隔符(如
C:
D:
等)。无论使用何种工具,都不能在文件名中使用无效字符。将它们替换为有效字符,或将其格式化为
ccyymdd HHMMSS
CCYY-MM-DD HHMMSS
。您的观点是正确的,但问题是我不知道如何在SAS中格式化日期时间。我几乎不了解SAS,我想这里的其他人也不知道,这只是掉在我的膝盖上。我想我取代的那个人是他们的SAS程序员,或者至少比我更了解它。b8601dt是我尝试过的事情之一。当我试图运行SAS程序时,我遇到了一个“找不到格式”错误。我正在使用SAS 9.1,也许这就是原因。这就是我们办公室里的情况,我无法控制。是的,这显然是正确的-必须在9.2道歉中添加,9.1.3已经足够老了,它不再得到很好的支持(你的办公室应该升级!)他们需要升级的不止一件事,但在我需要生成这个传输文件之前,它可能不会发生!当你的版本已经到了高中阶段,可能是时候升级了……;)如果您想要YYYYMMDD,那么
%sysfunc(今天(),yymmddn8。)
将为您提供该功能。例如,
%sysfunc(Today(),yymmddn8.)。&chour.&cmin.
。我最终将其细化为:
%let dt=%sysfunc(date(),yymmddn8);%设dt=&dt.%sysfunc(compress(%sysfunc(time(),time5),:);数据LabData和fileBaseName.&Udt(压缩=是)等。
data _null_;
date=put(datetime(), datetime21. -l);
substr(date, 10, 1)="T";
date=compress(date, ":");
call symputx('date_value', date);
run;

%put &date_value;