You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在q/KDB中将序列号转换为日期并更新至新增列

实现方案

首先明确转换逻辑前提:你给出的序列号为Excel 1900日期系统的序列号,若你给出的42095需对应2015.01.04,调整下方代码里的日期偏移量即可适配你的序列号基准,核心处理逻辑不变。

假设你的原表名为t,具体实现代码如下:

// EndDate存储为date类型(默认显示格式为YYYY.MM.DD)
t: update 
    EndDate:?[Product like "Bond:Bonds*"; `date$ (long Tenor) - 36527; 0Nd],
    Tenor:?[Product like "Bond:Bonds*"; `; Tenor] 
from t

如果要求EndDate存储为YYYY.MM.DD格式的字符串而非原生date类型,调整为以下代码:

// EndDate存储为字符串格式
t: update 
    EndDate:?[Product like "Bond:Bonds*"; string `date$ (long Tenor) - 36527; string 0Nd],
    Tenor:?[Product like "Bond:Bonds*"; ""; Tenor] 
from t

代码说明

  • 用q原生三元运算符?按Product匹配结果做分支处理,性能远优于逐行判断
  • Product like "Bond:Bonds*"实现前缀匹配,完全符合你给出的匹配规则
  • 匹配成功的债券类行:将Tenor列的字符串序列号转成long类型后,按基准偏移转成目标格式,同时将Tenor设为对应类型的空值(可根据原Tenor列的类型选择用`还是"")
  • 匹配失败的非债券类行:EndDate直接设为date类型空值0Nd,Tenor保留原有值不变

测试验证

你可以用你给出的示例数据构造测试表校验结果:

// 构造测试表
t:([] Class:`ClassA`ClassB`ClassC`ClassD; RIC:`RIC1`RIC2`RIC3`RIC4; Tenor:"42088" "42095" "5M" "1M"; Product:("Bond:Bonds Government";"Bond:Bonds Corporate";"FX:Forward";"IR:Swap"))

// 执行更新
t: update EndDate:?[Product like "Bond:Bonds*"; `date$ (long Tenor) - 36527; 0Nd], Tenor:?[Product like "Bond:Bonds*"; `; Tenor] from t

执行后前两行的EndDate分别为2015.03.26、2015.04.02,后两行EndDate为0Nd,Tenor保留5M、1M,符合需求要求。

内容的提问来源于stack exchange,提问作者codeforkdb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:18:02