根据q中的客户端句柄请求运行.z.pg和.z.ps

时间:2019-02-12 15:05:37

标签: kdb

我喜欢编写一个脚本,该脚本根据客户端选择的文件句柄在.z.pg和.z.ps之间进行选择,并将结果插入下表:

.ipc.history:enlist`startTime`endTime`event`handle`user`query`result`success!(0Np;0Np;`;0Ni;`;::;::;0b)

我使用了以下逻辑:

.ipc.logQuery:{[event;x]
        start:.z.p; r:get x;end:.z.p-start; 0b; //suc:{0b<>@[value;x;0b]};
        `.ipc.history insert (start;end;event;.z.w;.z.u;x;r;0b);r}

.z.pg:.ipc.logQuery`.z.pg;
.z.ps:.ipc.logQuery`.z.ps;

我在听:

q queryHistory2.q -p 5050

但是当客户端使用命令连接时,我会收到“类型错误”:

q)h:hopen 5050
q)h"2+2"
'type

1 个答案:

答案 0 :(得分:4)

类型错误来自“结束”列。您已将其定义为时间戳,但是当您减去2个时间戳时,Q返回时间跨度类型。

q)  a: .z.p
q)  b: a -1000
q)  type 0N!a-b 
q) (0D00:00:00.000003000 ;-16h)

要解决此问题,您需要将列的类型更改为时间跨度。

q) .ipc.history:enlist`startTime`endTime`event`handle`user`query`result`success!(0Np;0Nn;`;0Ni;`;::;::;0b)

q) `.ipc.history insert(a;.z.p-a;`.z.pg;.z.w;.z.u;"2+2";get "2+2";0b)
startTime                     endTime              event handle user        query result success
------------------------------------------------------------------------------------------------
                                                                            ::    ::     0      
2019.02.12D15:15:55.009781000 0D00:06:21.092914000 .z.pg 0      user "2+2" 4      0 

其他选择是在结束列中存储纳秒(或毫秒),而不是时间跨度。

您只需将时间跨度转换为long即可将时间跨度转换为纳秒。

 q)`long$end

为此,请将列类型更改为long。

 q) .ipc.history:enlist`startTime`endTime`event`handle`user`query`result`success!(0Np;0Nj;`;0Ni;`;::;::;0b)