是否存在负时间类型会产生意外结果的情况?

Are there any instances where a negative time type could give unexpected results?

是否存在负时间类型在用于特定目的时会产生意外结果的情况?例如,当在负时间值和非负时间值之间计算时间增量时,似乎没有任何问题。

time val
00:00:31.384 -0.3170017
00:06:00.139 0.9033492
00:07:01.099 -0.7661049

然后,为了 window 稍后加入 10 分钟 window

win:00:10:00;
winForJoin: (neg win;00:00:00) +\:(exec time from data);

first[winForJoin] 给出 -00:09:28.616 -00:03:59.861 -00:02:58.901

winForJoin[1]-winForJoin[0] 按预期给出 10 分钟

如果我没理解错的话,您是在问如果开始时间间隔为负时间,window 连接会如何表现? (由于间隔减法将值带入负值区域,相对于 00:00)。

简单的答案是,它的行为与时间是数字时没有任何不同,但在实践中,您可能会看到意想不到的结果,具体取决于 table 的设置方式和内容你正在努力实现。

以官方wiki中的例子为例:https://code.kx.com/q/ref/wj/

q)t:([]sym:3#`ibm;time:10:01:01 10:01:04 10:01:08;price:100 101 105)
q)a:101 103 103 104 104 107 108 107 108
q)b:98 99 102 103 103 104 106 106 107
q)q:([]sym:`ibm; time:10:01:01+til 9; ask:a; bid:b)
q)f:`sym`time
q)w:-2 1+\:t.time

/add volume too so it's easier to follow:
q)s:908 360 522 257 858 585 90 683 90;
q)update size:s from `q

/add an alternative range which has negative starting time
q)w2:(-11:00;1)+\:t.time

window 联接获取 q 中时间在时间​​范围对之间的所有行:

q)q[`time]within/:flip w
110000000b
011110000b
000001111b

在幕后,它在问:这些正数(报价时间)是否在这两个正数(window 范围)之间。没有理由它也不能问:这些正数是在这个负数和这个正数之间吗

q)q[`time]within/:flip w2
110000000b
111110000b
111111111b

您会注意到其中 all 个都大于负时间 - 这意味着它将包括从头开始的 all 行的 q table,直到该对的结束时间。这可以被认为是预期的行为 - 如果你的开始时间是负数,你必须意味着“从时间开始” - 也就是从 table.

开始的所有行

比较大小总和显示结果有何不同:

q)wj[w;f;t;(q;(sum;`size))]
sym time     price size
-----------------------
ibm 10:01:01 100   1268
ibm 10:01:04 101   1997
ibm 10:01:08 105   1448
q)wj[w2;f;t;(q;(sum;`size))]
sym time     price size
-----------------------
ibm 10:01:01 100   1268
ibm 10:01:04 101   2905
ibm 10:01:08 105   4353

最后 - 它可能会变得复杂的地方......这取决于你的 table 中的“负”时间意味着什么。如果您在 00:00(午夜)减去 10 分钟,您是否正在尝试访问前一天来自 23:50 的数据?还是 00:00 代表您的 table 的开始时间(第 0 行)?如果您尝试从前一天访问 23:50 那么您将遇到问题,因为 23:50 在您的负开始时间和正结束时间之间是 NOT , 例如:

q)23:50 within(-00:58:59;10:01:02)
0b

同样,这一切都取决于您的数据的外观和您尝试做的事情