1

doc中,我们可以按日期检索历史记录,但是如何检索该分类帐上所有表的最短日期?

我试过这个:

SELECT MIN(h.metadata.txTime) FROM history(Clients) AS h

但它给出了错误:<UNKNOWN>: at line <UNKNOWN>, column <UNKNOWN>: <UNKNOWN>; Expected number: 2021-08-04T12:24:07.921Z似乎MIN函数只能接收数字但没有办法将时间戳转换为纪元/unix时间戳?

SELECT MIN(TO_STRING(h.metadata.txTime,'yyyyMMddHHmmss.SSS')) FROM history(Clients) AS h

<UNKNOWN>: at line <UNKNOWN>, column <UNKNOWN>: <UNKNOWN>; Expected number: "20210804122407.921"

(尝试过 postgresql 演员风格::float也没有奏效)

编辑:没关系,有CAST

SELECT MIN(CAST(TO_STRING(h.metadata.txTime,'yyyyMMddHHmmss.SSS') AS float)) FROM history(Clients) AS h

这个可行,但希望浮点数足够准确以表示时间戳。

回到问题,如何从所有表中检索?

Table1 | minTxTime
Table2 | minTxTime
Table3 | minTxTime
4

1 回答 1

3

有两个步骤:

  1. 获取分类帐中的表格列表。
select tableId from information_schema.user_tables

将返回账本中所有表的 tableIds 结果集,包括活动的和非活动的。如果你只想要活动表,你可以where在上面的查询中添加一个子句:

select tableId from information_schema.user_tables tables where tables.status = 'ACTIVE'
  1. 要获取每个表的最小 txTime,然后您可以使用上述结果并将其输入到您的其他历史查询中。

您可以通过驱动程序以编程方式执行此操作。这是伪代码:

result = transaction {
  tables = execute("select tableId from information_schema.user_tables u where u.status = 'ACTIVE'")
  tables.map( t ->
    execute("SELECT MIN(CAST(TO_STRING(h.metadata.txTime,'yyyyMMddHHmmss.SSS') AS float)) FROM history(t)")
  )
}

编辑:这是一个正常运行的 NodeJS 代码

import { QldbDriver } from 'amazon-qldb-driver-nodejs';

const ledgerName = "my-test-ledger-1"
const serviceConfigOptions = {region: "us-east-2"};
const qldbDriver = new QldbDriver(ledgerName, serviceConfigOptions);

async function getTables() {
    return new Promise((resolve, reject) => {
        qldbDriver.getTableNames()
        .then((res) => {
            resolve(res);
        })
        .catch((err) => {
            console.log(err);
            reject(err);
        })
    })
}

async function minTxTime(table) {
    return new Promise((resolve, reject) => {
        qldbDriver.executeLambda(async (txn) => {
            const results = (await txn.execute("SELECT MIN(CAST(TO_STRING(h.metadata.txTime,'yyyyMMddHHmmss.SSS') AS float)) as minTxTime FROM history("+table+") as h")).getResultList();
            resolve(results);
        })
        .catch((err) => {
            console.log(err);
            reject(err);
        })
    });
}

async function main() {
    try {
        var tables = await getTables();
        for(var t in tables) {
            var res = await minTxTime(tables[t]);
            console.log(res);
        }
    }
    catch (error) {
        console.error(error);
    }
}

main()
于 2022-02-09T20:35:43.040 回答