如何使用BIGINT类型为日期计算每天的行数,从而为HSQLDB形成SQL查询?
我有一个HSQLDB版本。1.8.0,数据库的示例架构如下:如何使用BIGINT类型为日期计算每天的行数,从而为HSQLDB形成SQL查询?,sql,date,group-by,hsqldb,bigint,Sql,Date,Group By,Hsqldb,Bigint,我有一个HSQLDB版本。1.8.0,数据库的示例架构如下: CREATE CACHED TABLE ENTRY (ENTRYID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY, REQID VARCHAR, REVOCATIONDATE BIGINT) ENTRYID DATE_COUNT REVOCATIONDATE 1 10 2014-01
CREATE CACHED TABLE ENTRY
(ENTRYID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
REQID VARCHAR,
REVOCATIONDATE BIGINT)
ENTRYID DATE_COUNT REVOCATIONDATE
1 10 2014-01-01
2 5 2014-01-02
3 15 2014-01-03
SELECT ENTRYID, "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
SELECT MIN(ENTRYID), COUNT(ENTRYID), "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
GROUP BY "myclass.millisToDate"(REVOCATIONDATE)
我希望检索每个日期的行计数,类似于:
CREATE CACHED TABLE ENTRY
(ENTRYID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
REQID VARCHAR,
REVOCATIONDATE BIGINT)
ENTRYID DATE_COUNT REVOCATIONDATE
1 10 2014-01-01
2 5 2014-01-02
3 15 2014-01-03
SELECT ENTRYID, "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
SELECT MIN(ENTRYID), COUNT(ENTRYID), "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
GROUP BY "myclass.millisToDate"(REVOCATIONDATE)
问题是REVOCATIONDATE是一个BIGINT,而不是一个普通的日期或时间戳。这是供应商提供的数据库,因此,假设不允许更改模式
我如何创建一个SQL查询来实现这一点?简单的答案是HSQLDB1.8是一个旧版本,不支持一些高级功能。HSQLDB 2.3.x支持在不同表示形式之间进行转换的全套函数 使用HSQLDB1.8,您可以在Java中创建自己的函数,将时间戳的毫秒值转换为Java.sql.Timestamp或Java.sql.Date 在您创建的类中类似这样的内容:
static java.sql.Date millisToDate(long millis) {
return new java.sql.Date(millis);
}
如果随后在用于运行数据库的类路径中包含此类,则可以在SELECT语句中调用函数,如下所示:
CREATE CACHED TABLE ENTRY
(ENTRYID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
REQID VARCHAR,
REVOCATIONDATE BIGINT)
ENTRYID DATE_COUNT REVOCATIONDATE
1 10 2014-01-01
2 5 2014-01-02
3 15 2014-01-03
SELECT ENTRYID, "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
SELECT MIN(ENTRYID), COUNT(ENTRYID), "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
GROUP BY "myclass.millisToDate"(REVOCATIONDATE)
您的结果示例如下所示:
CREATE CACHED TABLE ENTRY
(ENTRYID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,
REQID VARCHAR,
REVOCATIONDATE BIGINT)
ENTRYID DATE_COUNT REVOCATIONDATE
1 10 2014-01-01
2 5 2014-01-02
3 15 2014-01-03
SELECT ENTRYID, "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
SELECT MIN(ENTRYID), COUNT(ENTRYID), "myclass.millisToDate"(REVOCATIONDATE) FROM ENTRY
GROUP BY "myclass.millisToDate"(REVOCATIONDATE)
实际上,我还没有尝试过上面的任何建议,但它们应该会起作用,也许需要做一些修改。您需要一个接受BIGINT值并返回实际日期的函数。如果没有进一步的信息,我不知道该函数的代码可能是什么样子。我查看了1.8版SQL用户指南,没有看到任何与BIGINT日期相关的内容。这可能是因为供应商创建了自己的日期自定义实现。您需要从他们那里了解日期在BIGINT中是如何表示的,这样您就可以编写转换函数了。我想要一个原生SQL命令来完成它,这样我就可以从HSQL工具中完成它。如果您检查Java以了解算法,一些内联数学可能是可能的。