从 Java 插入时如何在 q 中获取日期对象

How to get a Date object in q when inserting from Java

根据QforMortals2,q的date的等价表示是java.util.Date。 同样,q 的 datetime 等于 java.sql.Timestamp.

但是,当我将table从Java推送到q时,q会自动将java.util.Date对象转换为datetime对象,其中也包含时间.然后我尝试将对象推为 java.sql.Date 并且发生了同样的事情:再次 q 将其识别为 datetime 原子。

如何将 Java 的 Date 对象传递给 q,以便 q 正确识别它(没有时间)?

注意:我宁愿不预先指定 table 的格式 ["d"$()],而是让 q 自动正确识别对象。

更新[已解决]

感谢 user2393012 我发现了我的错误。

首先,q 不接受直接插入未定义的 table。但是,当您调用一个进程 a,而该进程又向进程 b 执行插入时,它 确实 允许插入未定义的 tables .

例如使用 \p 5002 定义进程 b,并使用:

定义进程 a
\p 5001
h:hopen `::5002;
.u.upd:{[x;y] h (insert; x; y)};

现在调用.u.upd时,实际上可以在进程b.

中插入一个未定义的table

现在,当使用 c.ks(Object) 时,对象应该由保存数据的 数组 组成。

我的错误是我将数据数组定义为

new Date[] {new java.sql.Date(new java.util.Date().getTime())}

反对:

new java.sql.Date[] {new java.sql.Date(new java.util.Date().getTime())}

因此,java.sql.Date 在放入数组时被解析回 java.util.Date

以下 Java 代码因此按预期工作:

import java.io.IOException;
import kx.c;
import kx.c.*;

public class testingDate {

    public static c conn;

    public static void main(String[] args) throws KException, IOException {

        Object[] data     = new Object[] {new java.sql.Date[] {new java.sql.Date(new java.util.Date().getTime())}};
        c.Flip tab        = new c.Flip(new c.Dict(new String[] {"date"}, data));
        Object[] updquery = new Object[] { ".u.upd", "test", tab };

        conn = new c("localhost", 5001);

        try {
            conn.k(updquery);
        } catch (IOException e) {
            System.err.println("error sending data to server.");
        }   
    }
}

在进程 b 中保存 table test 内容:

date      
----------
2015.03.10

the equivalent representation of q's date is java.util.Date. Likewise, q's datetime is equal to java.sql.Timestamp.

如果您使用 https://github.com/KxSystems/kdb/blob/master/c/kx/c.java 中的 c.java

Object r() {
     // read from stream
     ....
     case-14:return rd()
     ....
}
Date rd(){int i=ri();return new Date(i==ni?nj:gl(k+86400000L*i));}

(Date那里指的是java.sql.Date)

与您正在做的事情类似,即将日期写入流(计算 2000.01.01 的偏移量):

void w(Date d){long j=d.getTime();w(j==nj?ni:(int)(lg(j)/86400000-10957));}

正在查看 Java/Kx、http://code.kx.com/q/interfaces/java-client-for-q/ 的参考页:

java.util.Date  -15 (=== q datetime)
Date    -14         (=== q date)

(后者为java.sql.Date)

如果您使用第三方 API,当然可能会有所不同。