Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 SAS:与&;分开的日期;将日期_分成单独的行_Date_Sas - Fatal编程技术网

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,这是我的责任——当我准备这个例子来重现现实世界的问题时,我仔细看了一遍。