在下面的代码中:
proc sql;
select
datetime() format = datetime22.5,
datetime() format = datetime22.5,
case
when datetime() = datetime() then 'equal'
else 'no equal'
end
from data1 (obs=1);
quit;
是否有 any 选项,所有
datetime()
调用都会解析为略有不同的时间戳?
在数据步骤中,所有指令都依次运行,因此在后续行中放置多个
datetime()
调用最终会返回小数点位置不同的时间戳。 SQL 调用中是否存在类似的风险,或者所有 datetime()
调用是否同时得到解决?
我想确认,在单个 SQL 步骤中放置多个
datetime()
调用不会在毫秒内解决差异。
没有选项强制每次使用
datetime
函数返回唯一值。此外,SQL
规划器可能正在执行一些未知的优化,从而导致体验相同。
如果您需要此类严格的单调值,请考虑为每个日期时间结果添加额外的关联单调变量。
示例
在步骤运行时使用未记录的
monotonic()
函数可能会很棘手。
这并不提供人们可能认为的独特性。
proc sql;
select
datetime() format = datetime22.5,
datetime() format = datetime22.5,
case
when datetime() = datetime() then 'equal'
else 'no equal'
end
from sashelp.class(obs=1);
quit;
在编译时使用通过 %sysfunc
获得的
session唯一单调值即可。
proc sql;
select
datetime() format = datetime22.5, %sysfunc(monotonic()) as dt1_m,
datetime() format = datetime22.5, %sysfunc(monotonic()) as dt2_m,
case
when datetime() = datetime() and %sysfunc(monotonic())=%sysfunc(monotonic()) then 'equal'
else 'no equal'
end
from sashelp.class (obs=1);
quit;
在 Windows 平台中,
datetime()
函数的替代方法是使用 moduleN()
函数调用系统例程 GetSystemTimePreciseAsFileTime
GetSystemTimePreciseAsFileTime 函数以尽可能高的精度检索当前系统日期和时间 (<1us)