经过大量研究,我发现 3 个查询似乎可以回答我的问题。
欢迎任何更正,SQL 不是我最了解的...
复制间隔由 2 TIMESTAMP WITHOUT TIME ZONE 定义,因为我使用的驱动程序是由 UNO API (OpenOffice / LibreOffice) 提供的驱动程序,而 getter/setter (getTimestamp/setTimestamp) 不管理 TIMESTAMP WITH TIME ZONE ,分别为timestart 和timestop。
rowstart: 是声明为 TIMESTAMP GENERATED ALWAYS AS ROW START 的列。
rowend: 是声明为 TIMESTAMP GENERATED ALWAYS AS ROW END 的列。
customerid: 是客户表的主键。
要查找已更新的记录:
SELECT current.customerid FROM customer FOR SYSTEM_TIME AS OF timestop + SESSION_TIMEZONE() AS current
INNER JOIN customer FOR SYSTEM_TIME FROM timestart + SESSION_TIMEZONE() TO timestop + SESSION_TIMEZONE() AS previous
ON current.customerid = previous.customerid AND current.rowstart = previous.rowend;
要查找已插入的记录:
SELECT current.customerid FROM customer FOR SYSTEM_TIME AS OF timestop + SESSION_TIMEZONE() current
LEFT JOIN customer FOR SYSTEM_TIME AS OF timestart + SESSION_TIMEZONE() previous
ON current.customerid = previous.customerid WHERE previous.customerid IS NULL;
要查找已删除的记录:
SELECT previous.customerid FROM customer FOR SYSTEM_TIME AS OF timestart + SESSION_TIMEZONE() previous
LEFT JOIN customer FOR SYSTEM_TIME AS OF timestop + SESSION_TIMEZONE() current
ON previous.customerid = current.customerid WHERE current.customerid IS NULL;
我不知道使用 DATABASE_TIMEZONE 代替 SESSION_TIMEZONE 是否更明智,谁想确认...
我没有时间进行大规模测试,但即使有很多记录,它也能快速运行。
等等……
编辑:我刚刚注意到使用 hsqldb 2.5.1 版本很重要,因为我没有设法在 2.5.0 下进行正确操作...