SAS Proc SQL中datetime()函数时间分辨率及调用一致性问询
SAS Proc SQL里多次调用datetime()会不会有毫秒级差异?
先说结论:默认情况下,单Proc SQL步里的所有datetime()调用会返回完全相同的时间戳,不会有毫秒级差异,但有个特殊设置可能打破这个一致性。
为什么和Data步不一样?
Data步是逐行逐句按顺序执行的,每调用一次datetime()就实时抓取一次系统时间,连续调用自然会产生毫秒甚至微秒级的差异。
但Proc SQL的执行逻辑不同:它会先把整个查询语句解析完成、生成执行计划,然后在查询开始执行的同一个时间点一次性获取datetime()的结果,之后所有用到datetime()的地方都复用这个值,所以默认情况下所有调用结果完全一致。
什么情况会出现差异?
只有当你开启了SQLEXECTHREADS=YES(默认值为NO)的多线程执行模式时,才有可能出现差异。如果Proc SQL采用多线程并行处理查询,datetime()的调用被分配到不同线程执行,不同线程可能在略微不同的时间点抓取系统时间,就会产生毫秒级差异。不过这种情况非常少见,就算开启了多线程,SAS也会尽量保证函数调用的一致性,除非查询的并行逻辑强制拆分了时间获取的时机。
怎么验证?
你可以运行这段代码测试:
proc sql; select datetime() format = datetime22.5, datetime() format = datetime22.5, case when datetime() = datetime() then 'equal' else 'no equal' end as result from sashelp.class (obs=1); quit;
默认配置下,前两列的时间戳完全相同,第三列会返回equal。如果开启options sqlexecthreads=yes;后再次执行,极端情况下可能出现no equal的结果,但概率极低。
要是想绝对保证时间一致怎么办?
可以先把datetime()的结果存储为一个临时变量,再复用这个变量,比如:
proc sql; select current_dt, current_dt, case when current_dt = current_dt then 'equal' else 'no equal' end as result from (select datetime() format=datetime22.5 as current_dt from sashelp.class(obs=1)); quit;
内容的提问来源于stack exchange,提问作者skywhalecommando
相关产品推荐
相关产品推荐

