现在的项目里有几个需求是关于用时间控制数据的抽取计划的,以后相关的内容也会加到这个帖子内。
一、需求:有A、B、C三个数据源,要求在周四抽取A、B的数据,周三抽取C的数据,ABC三个数据源的抽取过程都在一个generatorQVD文件中执行。task定义为每天都自动刷新一次。
实现:假设有几个tab,tab1为其他相关数据,tab2为A的抽取,tab3为B的抽取,tab4为C的抽取,tab5为将ABC的数据加载到同一个内存表并保存QVD。
需要用到if..then..elseif..then..endif.和weekday(). weekday()返回0~6(MON~SUN)对应周一到周日。
在tab2的前面定义变量获取当前的weekday,用if判断若当前为周四(weekda()=3),则抽取AB的数据。
LET vWeekDay=num(WEEKDAY(UTC()));
if $(vWeekDay)=3 then
后面就是抽取A的数据,
最后加一个store tableA into TableA.qvd(QVD);
Drop table tableA;
然后tab3不变
最后加一个store tableB into TableB.qvd(QVD);
Drop table tableB;
到tab4里最前面
elseif $(vWeekDay)=2 then
后面是抽取C的数据,
最后加一个store tableC into TableC.qvd(QVD);
Drop table tableC;
在tab5的最前面加endif 这时整个if判断结束,tab5里整合ABC的表直接从QVD文件加载数据即可。回顾一下就是判断若今天为周四则抽取AB的数据,若今天为周三则抽取C的数据,最后都存成了QVD文件,然后结束判断,最终表里直接从三个QVD文件加载数据。若今天为周三,则AB的文件仍然是上周四时保存的,tab2,3的内容不会执行,tab5里的总表也不会报错。其他同理。
二、需求:同样是ABC三个数据源,要求是在UTC时间的5PM抽取BC的数据,UTC时间为10PM时抽取A的数据,并最终ABC整合成一个最终表。
实现:当然是可以做成两个generatorQVD文件,分别做task,在不同的时间抽取数据,但是为了保证脚本的一致性和不修改原来的脚本,我打算在原generator文件中加上if判断,然后给这个文件制定两个task刷新时间。
假设有几个tab,tab1为其他相关数据,tab2为A的抽取,tab3为B的抽取,tab4为C的抽取,tab5为将ABC的数据加载到同一个内存表并保存QVD。
需要用到InDayToTime()函数,函数有四个参数,第四个参数可忽略,第一个参数是入参,第二个参数为截止时间,第三个参数为整数,可以理解为偏移量,给二参的时间+n天或-n天,第四个参数为起始时间。
首先在tab2的前面加上
let vTimeTest1=InDayToTime(UTC(),today()&' '&MakeTime(23,0,0),0,today()&' '&MakeTime(21,0,0));
if $(vTimeTest1)=-1 then
后面是抽取A的数据,表示如果当前时间为9pm~11pm之间则执行A部分。然后保存QVD, endif。
在tab3前面
let vTimeTest2=InDayToTime(UTC(),today()&' '&MakeTime(16,0,0),0,today()&' '&MakeTime(18,0,0));
if $(vTimeTest2)=-1 then
后面是抽取BC的数据,表示如果当前时间为4pm~6pm之间则执行BC部分。然后保存QVD, endif。
最后在Tab5里从三个QVD文件中抽取数据到总表里。
然后task的计划为,每天的UTC时间5pm执行一次,10pm执行一次。
三、不算需求,只是一个新的方法,因为也跟时间控制有关就记录一下。
sleep ---可以让脚本等待一段时间再执行(后面跟正整数,单位为毫秒,最大为3600000)。
例:sleep 60000; 意思为等待60000毫秒/60秒/1分钟.
如果想等待大于一小时,可以写多个sleep即可。
//-----------------更新:2016-7-14------------------
需求一,若按照上面的做法,第一周时会报错,因为文件不存在,这时可以在最后的总表合并前面加一个判断:
let vIfQVDExist=len(QvdCreateTime('file1.qvd'))*len(QvdCreateTime('file2.qvd'))*len(QvdCreateTime('file3.qvd'));
EXIT Script when $(vIfQVDExist)=0;
就是判断若三个文件任意一个不存在就不执行合并表的操作。