Technical Blog Post
Abstract
RPG 时间戳
Body
曾经有细心的客户反映过,通过RPGLE中的内嵌函数%TIMESTAMP,无法获得微秒级的数据。的确,这是目前
RPGLE中该内嵌函数的一个限制,只能获得毫秒级的数据,尽管,RPGLE的TIMESTAMP数据类型本身可以支持
到微秒级的精度。如代码示例一所示。
通过该段代码,我们可以得到如结果示例一中的结果,最后三位是0。
那么,既然前面提到过,RPGLE中,时间戳TIMESTAMP数据类型,本身是支持微秒级的,我们如何获取到微秒级的数据呢?方法
可以有好 几种。首先,最简单的,我们可以通过嵌入式SQL语句来实现,如代码示例二所示:
该段代码的运行结果请见结果示例二:
其次,如果不考虑SQL,还可以通过调用系统函数 gettimeofday() 来实现。相关的信息中心的链接为:
http://pic.dhe.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/apis/gettod.htm。
该链接中提供了一个C语言实现的例子。用户可以稍作改动, 让该函数返回调用API所获得的时间戳,然后通过ILE的混合编程来在RPG
语言中调用该C语言编写的函数。也可以直接编写RPGLE程序来调 用这个系统API。最后,用户还可以通过API QWCRSVAL来取系统值
QDATETIME来获取20位精确到微秒级的时间戳。其结果的格式为:
YYYYMMDDHHNNSSXXXXXX,
其中YYYY为年份, MM是月份, DD是日期, HH是小时, NN 是分, SS是秒, XXXXXX是微秒。
该API可参见: http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/apis/qwcrsval.htm
请注意,尽管可以获取微秒级的时间戳,我们仍然不建议客户用时间戳作为交易的唯一标识。因为在并发交易中,取到完全相同的时间
戳,也还是有可能的,尽管概率很小。接下来,我们来探讨下时间戳和性能相关的话题。日期DATE,时间TIME和时间戳TIMESTAMP
相关的操作,会有些CPU的消耗,因为在每次用到这些字段时,都会发生触发关于日期,时间的合法性检查。如果程序中不停有这些数
据类型的字段的操作,那么,还是可以考虑想办法避免因为这些操作而带来的CPU开销的。在6.1和7.1中,都提供了一个新的控制表(H表)
关键字VALIDATE(*NODATETIME),请参考代码示例三。
代码示例三
该新功能需要安装相应的PTF,6.1为SI43988,7.1为SI43157。指定该关键字后,可以让RPGLE编译器将这些日期,时间,时间戳类型
的字段视为文字数值数据,从而避免相应的合法性检查。这个关键字需要小心使用,因为一旦使用,将引入出现非法数据的风险,并且
非法数据有可能随着程序逻辑的处理,传染给其他字段或变量。所以,对于该关键字,我们推荐以下适用场景:
1、仅用于从未发生过日期,时间或时间戳数据非法错误的那些程序模块。
2、当某一数值首次赋值给这种类型字段之前,使用是否存在而强行进行合法性检查。
当发生大量的涉及这类数据类型的I/O,该关键字能明显提高应用程序的性能表现。
作者:
了解更多关于IBM i 的信息,请关注IBM i 新浪官方微博@IBMiChina。
UID
ibm11144780