Date SAS:与&;分开的日期;将日期_分成单独的行
我有一个这样的例子:Date SAS:与&;分开的日期;将日期_分成单独的行,date,sas,Date,Sas,我有一个这样的例子: 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, '13Jun20
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;
我需要一些智能连接(可能带有单独的小时映射表)来实现以下功能:
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;
proc-sql;
将表测试创建为
选择t1.id,
t1.name,
t1.日期(从),
t1.U日期至
起始日期\表t1内部联接
WORK.CAL\u时间t2在t1.日期\u从>=t2.时间和
t1.date_to看起来你在比较苹果(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
您可能只想将datetime值的时间部分与时间值进行比较。此外,将开始时间向下舍入,将结束时间向上舍入到小时
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
看起来您正在尝试比较日期时间值(自1960年以来的秒数)和时间值(自午夜以来的秒数)。也许您只需要在datetime值上使用timepart()
函数,就可以提取当天的时间部分?嗨,汤姆,谢谢您的解决方案。效果很好。我还学到了一些关于“加入之间”的新知识。关于datetiem和date,这是我的责任——当我准备这个例子来重现现实世界的问题时,我仔细看了一遍。