intck()给出负值

时间:2019-09-15 16:38:49

标签: date sas

我是SAS的新手,我很难找到2个日期之间的差额。 我有2列:checkin_date和checkout_date 日期以mmddyy10为单位。格式(mm / dd / yyyy)。

我使用了以下代码:

stay_days= intck('day', checkin_day, checkout_day);

我在同一个月的日期中获得了正确的值,但在2个月中的几天中获得了错误的值。例如,2014年2月6日与2014年2月11日之间的差异为5。但是,2014年1月31日与2014年2月13日之间的差异为-18。

我也只是尝试将两者都减去:

stay_day = checkout_day - checkin_day;

我也得到相同的结果。

我的整个代码:

    data hotel;
infile "XXXX\Hotel.dat";
input room_no num_guests checkin_month checkin_day checkin_year checkout_month checkout_day checkout_year internet_used $ days_used room_type $16. room_rate;
checkin_date = mdy(checkin_month,checkin_day,checkin_year);
informat checkin_date mmddyy.;
format checkin_date mmddyy10.;
checkout_date = mdy(checkout_month,checkout_day,checkout_year);
informat checkout_date mmddyy.;
format checkout_date mmddyy10.;
stay_day= intck('day', checkin_day, checkout_day);

2 个答案:

答案 0 :(得分:2)

您的问题是错别字-在intck()函数中使用了错误的变量。您正在使用变量“ xxx_DAY”,它是一个月的DAY,而不是完整的DATE。更改为stay_day= intck('day', checkin_date, checkout_date);

答案 1 :(得分:1)

您的数据中的日期值可能在错误的变量中。使用减法时,顺序应为ENDDATE - STARTDATE。使用INTNX()函数时,顺序应为STARTDATE至ENDDATE。无论哪种情况,如果STARTDATE变量中的值是ENDDATE变量中的值之后,则差将为负数。

也许您需要清理数据?

获取2014年1月31日和2014年2月13日之间的-18的唯一方法是提取月份中的某天并将其减去。

diff3 = day(end) - day(start);

这与从13中减去31相同。

使用日期作为示例:

data check;
  input start end ;
  informat start end mmddyy.;
  format start end yymmdd10.;
  diff1=intck('day',start,end);
  diff2=end-start;
cards;
02/06/2014 02/11/2014
1/31/2014  2/13/2014 
;

结果:

Obs         start           end    diff1    diff2

 1     2014-02-06    2014-02-11       5        5
 2     2014-01-31    2014-02-13      13       13