从 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,当然可能会有所不同。
根据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
.
现在,当使用 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,当然可能会有所不同。