为何DolphinDB函数中date对象触发「非XDB连接或函数」错误?
DolphinDB函数封装查询报错问题解决
问题场景
表定义
dt = 2025.01.01T01:01:51.100 2025.01.02T01:01:51.000 2025.01.03T04:01:51.900 sym = ["IBM", "MSFTN", "GOOGS"] value = 1..3 t = table(dt, sym, value)
直接查询正常执行
day = "20250101" date = temporalParse(day, "yyyyMMdd") select * from t where date(dt) = date /* 执行结果: dt sym value 2025.01.01T01:01:51.100 IBM 1 */
函数封装后触发错误
def myFunc(day, t) { date = temporalParse(day, "yyyyMMdd") return select * from t where date(dt) == date } myFunc("20250101", t) // 错误信息:The object '2025.01.01' is neither a XDB connection nor a function definition. RefId: S06006
错误码S06006表示调用了不可调用的对象,仅函数或XDB连接可被调用。
已尝试操作:
- 确认函数外的直接查询逻辑正常运行
- 验证
temporalParse返回正确的DATE类型值(如2025.01.01) - 检查函数拼写与语法无问题
报错原因分析
函数内部定义的局部变量date优先级高于系统内置函数date()。执行date(dt)时,DolphinDB会将date解析为局部变量(值为2025.01.01,属于DATE类型的数值对象),而非系统内置的日期转换函数。由于数值对象无法被调用,因此触发S06006错误。
解决方案
方案1:修改局部变量名避免冲突
将函数内的变量名改为不与系统函数重名的名称,例如targetDate:
def myFunc(day, t) { targetDate = temporalParse(day, "yyyyMMdd") return select * from t where date(dt) == targetDate } myFunc("20250101", t)
方案2:使用全局作用域限定符调用系统函数
通过::强制指定调用全局作用域的系统函数,无需修改变量名:
def myFunc(day, t) { date = temporalParse(day, "yyyyMMdd") return select * from t where ::date(dt) == date } myFunc("20250101", t)
验证结果
修改后的函数执行后,将返回正确的查询结果:
dt sym value 2025.01.01T01:01:51.100 IBM 1
内容的提问来源于stack exchange,提问作者Shilin Wang
相关产品推荐
相关产品推荐

