Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 如何在日期之间创建变量_Date_Sas - Fatal编程技术网

Date 如何在日期之间创建变量

Date 如何在日期之间创建变量,date,sas,Date,Sas,我正在努力创建间隔日期的财政年度变量。我想要1819(2018/19财年)等变量 data-mydata; 设置mydata; 财政年度=9999。; 如果'2018年7月1日'd不确定你做错了什么,但无论如何,这是一个更好的方法。注意,这假设您的输入变量是数字日期变量,而不是字符变量-请检查!如果是字符变量,则需要将其输入到数字日期变量 首先,我们制作一些虚假数据-您不需要此步骤: data have; format datevar date9.; do datevar = '02JA

我正在努力创建间隔日期的财政年度变量。我想要1819(2018/19财年)等变量

data-mydata;
设置mydata;
财政年度=9999。;

如果'2018年7月1日'd不确定你做错了什么,但无论如何,这是一个更好的方法。注意,这假设您的输入变量是数字日期变量,而不是字符变量-请检查!如果是字符变量,则需要将其输入到数字日期变量

首先,我们制作一些虚假数据-您不需要此步骤:

data have;
  format datevar date9.;
  do datevar = '02JAN2017'd to '01FEB2021'd by 20;
    output;
  end;
run;
现在,我们使用(时间间隔增量函数)和年.7间隔(年,但移动7-在本例中为7个月-因此是每年的7月1日)并从中提取
YEAR()
。最后,我们使用模(余数)函数做一些数学运算以获得精确值(从该日期的年份分量),获取最后2位数字并将其相加

data want;
  set have;
  fy_start = year(intnx('year.7',datevar,0));
  finyear = cats(mod(fy_start,100),mod(fy_start+1,100));
run;
  
我要指出的是,我并不特别喜欢这样做——有更好的方法,特别是使用格式,来显示实际生成原始数据值的日期值是哪个财政年度

proc format;
  value finyr
  '01JUL2016'd - '30JUN2017'd = '1617'
  '01JUL2017'd - '30JUN2018'd = '1718'
  '01JUL2018'd - '30JUN2019'd = '1819'
  '01JUL2019'd - '30JUN2020'd = '1920'
  '01JUL2020'd - '30JUN2021'd = '2021'
  '01JUL2021'd - '30JUN2022'd = '2122'
  ;
quit;

data want;
  set have;
  format datevar finyr.;
run;
如果您确实需要在值中使用它,当然可以始终使用PUT(
newval=PUT(datevar finyr.);)


该格式可以通过编程方式制作,而不是像上面那样使用CNTLIN数据集手工制作,以避免每年都要对其进行更新。

不确定您做错了什么,但无论如何,这是一种更好的方式。注意,这假设您的输入变量是数字日期变量,而不是字符变量-请检查!如果是字符变量,则需要将其输入到数字日期变量

首先,我们制作一些虚假数据-您不需要此步骤:

data have;
  format datevar date9.;
  do datevar = '02JAN2017'd to '01FEB2021'd by 20;
    output;
  end;
run;
现在,我们使用(时间间隔增量函数)和年.7间隔(年,但移动7-在本例中为7个月-因此是每年的7月1日)并从中提取
YEAR()
。最后,我们使用模(余数)函数做一些数学运算以获得精确值(从该日期的年份分量),获取最后2位数字并将其相加

data want;
  set have;
  fy_start = year(intnx('year.7',datevar,0));
  finyear = cats(mod(fy_start,100),mod(fy_start+1,100));
run;
  
我要指出的是,我并不特别喜欢这样做——有更好的方法,特别是使用格式,来显示实际生成原始数据值的日期值是哪个财政年度

proc format;
  value finyr
  '01JUL2016'd - '30JUN2017'd = '1617'
  '01JUL2017'd - '30JUN2018'd = '1718'
  '01JUL2018'd - '30JUN2019'd = '1819'
  '01JUL2019'd - '30JUN2020'd = '1920'
  '01JUL2020'd - '30JUN2021'd = '2021'
  '01JUL2021'd - '30JUN2022'd = '2122'
  ;
quit;

data want;
  set have;
  format datevar finyr.;
run;
如果您确实需要在值中使用它,当然可以始终使用PUT(
newval=PUT(datevar finyr.);)


可以使用CNTLIN数据集以编程方式制作格式,而不是像上面那样手工制作,以避免每年都要更新它。

您可以尝试将第4行代码修改为:

data mydata;
set mydata;
FinYear = 9999.;
if '01JUL2018'd <= ConductedDate and ConductedDate <= '30JUN2019'd then FinYear=1819;
run;
data-mydata;
设置mydata;
财政年度=9999。;

如果'01JUL2018'd您可以尝试将第4行代码修改为:

data mydata;
set mydata;
FinYear = 9999.;
if '01JUL2018'd <= ConductedDate and ConductedDate <= '30JUN2019'd then FinYear=1819;
run;
data-mydata;
设置mydata;
财政年度=9999。;

如果“2018年7月1日”显示您的数据、任何日志窗口警告或错误以及您在
mydata
中得到的结果。可能是
ConductedDate
是一个字符变量。您还可以考虑创建一种自定义格式,将日期范围映射到FinYear中的分类值。您需要删除9999之后的句点。但您的代码是正确的,语法方面是正确的。从逻辑上说,谁知道呢……你实际上没有说什么“不起作用”。在
mydata
中显示你的数据、任何日志窗口警告或错误以及你得到的结果。可能是
ConductedDate
是一个字符变量。您还可以考虑创建一种自定义格式,将日期范围映射到FinYear中的分类值。您需要删除9999之后的句点。但您的代码是正确的,语法方面是正确的。从逻辑上说,谁知道……你实际上没有说什么“不起作用”。