Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用BIGINT类型为日期计算每天的行数,从而为HSQLDB形成SQL查询?_Sql_Date_Group By_Hsqldb_Bigint - Fatal编程技术网

如何使用BIGINT类型为日期计算每天的行数,从而为HSQLDB形成SQL查询?

如何使用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

我有一个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-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以了解算法,一些内联数学可能是可能的。