首页 > 解决方案 > SAS:将 date_from 和 date_to 分隔成单独的行

问题描述

我有一个这样的例子:

data date_table;
stop;
    length id $32.;
    length name $32.;
    length date_from date_to 8.;
    format date_from date_to datetime19.;
run;


proc sql;

insert into date_table 
    values ('1', 'Mark', '13Jun2019 08:39:00'dt, '13Jun2019 11:39:00'dt)
    values ('2', 'Bart', '13Jun2019 13:39:00'dt, '13Jun2019 17:39:00'dt);

quit;

在此处输入图像描述

我需要一些智能连接(可能有单独的小时映射表)来实现这样的事情:

在此处输入图像描述

我现在一直在尝试的是使用映射表

在此处输入图像描述

并加入:

proc sql;

create table testing as 
select t1.id,
        t1.name,
        t1.date_from,
        t1.date_to

from DATE_TABLE t1 inner join 
     WORK.CAL_TIME t2 on t1.date_from >= t2.Time and 
                         t1.date_to <= t2.Time;

quit;

但当然结果是空表,因为日期 dpoens 不想加入。我可能会将 date_from 和 date_to 减少到完整小时,但这样的加入仍然不起作用。

帮助。

标签: datesas

解决方案


看起来您正在将苹果 (DATETIME) 与橙子 (TIME) 进行比较。这些数字的数量级完全不同。

684   data _null_;
685
686   dt = '13Jun2019 08:39:00'dt ;
687   tm = '08:00't ;
688   put (dt tm) (=comma20.);
689   run;

dt=1,876,034,340 tm=28,800

您可能只想将日期时间值的时间部分与时间值进行比较。还要将您的开始时间向下舍入,将结束时间向上舍入到小时。

data date_table;
  length id name $32 date_from date_to 8;
  format date_from date_to datetime19.;
  input id name (date:) (:datetime.);
cards;
1 Mark 13Jun2019:08:39:00 13Jun2019:11:39:00
2 Bart 13Jun2019:13:39:00 13Jun2019:17:39:00
;
data cal_time;
 do time='08:00't to '21:00't by '01:00't ;
   output;
 end;
 format time time5.;
run;

proc sql;
create table testing as 
select t1.id
     , t1.name
     , max(t1.date_from,dhms(datepart(t1.date_from),0,0,t2.time))
        as datetime_from format=datetime19.
     , min(t1.date_to,dhms(datepart(t1.date_to),0,0,t2.time+'01:00't))
        as datetime_to format=datetime19.
     , t2.time
from DATE_TABLE t1 
inner join WORK.CAL_TIME t2 
  on t2.time between intnx('hour',timepart(t1.date_from),0,'b')
                 and intnx('hour',timepart(t1.date_to),0,'e')
;

quit;

结果

Obs    id    name          datetime_from            datetime_to     time

 1     1     Mark     13JUN2019:08:39:00     13JUN2019:09:00:00     8:00
 2     1     Mark     13JUN2019:09:00:00     13JUN2019:10:00:00     9:00
 3     1     Mark     13JUN2019:10:00:00     13JUN2019:11:00:00    10:00
 4     1     Mark     13JUN2019:11:00:00     13JUN2019:11:39:00    11:00
 5     2     Bart     13JUN2019:13:39:00     13JUN2019:14:00:00    13:00
 6     2     Bart     13JUN2019:14:00:00     13JUN2019:15:00:00    14:00
 7     2     Bart     13JUN2019:15:00:00     13JUN2019:16:00:00    15:00
 8     2     Bart     13JUN2019:16:00:00     13JUN2019:17:00:00    16:00
 9     2     Bart     13JUN2019:17:00:00     13JUN2019:17:39:00    17:00

推荐阅读