IBM Support

RPG 时间戳

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,该关键字能明显提高应用程序的性能表现。

 

作者:

钟嘉田:zhongjt@cn.ibm.com

了解更多关于IBM i 的信息,请关注IBM i 新浪官方微博@IBMiChina

 

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB57","label":"Power"}}]

UID

ibm11144780