如何查询system versioned table的近期变更记录
系统版本表查询近10分钟变更记录实现方案
系统版本表(时态表)内置两个系统自动维护的时间段列,默认命名通常为SysStartTime和SysEndTime,无需依赖自行创建的插入日期列,直接通过系统列即可精准捕获所有插入、修改操作记录。
- 你之前使用的
BETWEEN为闭区间逻辑,容易命中边界重复记录;CONTAINED IN仅匹配生命周期完全落在目标区间内的记录,完全不匹配查询变更的需求,建议使用FOR SYSTEM_TIME FROM...TO子句实现。
以下为SQL Server语法示例,其他数据库仅需调整时间计算函数即可:
-- 计算查询时间区间:最近10分钟 DECLARE @StartDateTime DATETIME2 = DATEADD(MINUTE, -10, SYSUTCDATETIME()); DECLARE @EndDateTime DATETIME2 = SYSUTCDATETIME(); -- 查询所有变更记录(含修改产生的历史版本) SELECT * FROM 你的表名 FOR SYSTEM_TIME FROM @StartDateTime TO @EndDateTime ORDER BY SysStartTime DESC;
上述查询匹配规则为
SysStartTime < @EndDateTime AND SysEndTime > @StartDateTime,覆盖两类变更:
- 新插入记录:
SysStartTime落在近10分钟区间内的新记录- 修改记录:修改前的旧版本记录
SysEndTime落在区间内,修改后的新版本记录SysStartTime落在区间内,两个版本都会返回
如果仅需要查询变更后的最新版本记录,不需要历史版本,可使用如下写法:
DECLARE @StartDateTime DATETIME2 = DATEADD(MINUTE, -10, SYSUTCDATETIME()); SELECT DISTINCT t.* FROM 你的表名 t INNER JOIN 你的表名_History ht -- 系统版本表关联对应的历史表,默认后缀为_History ON t.主键字段 = ht.主键字段 WHERE ht.SysStartTime >= @StartDateTime OR t.SysStartTime >= @StartDateTime;
- 注意:系统版本表的时间列默认使用UTC时间,计算区间时不要使用本地时区时间,避免时区差导致查询结果错误
- MySQL环境下仅需将时间计算替换为
DATE_SUB(UTC_TIMESTAMP(), INTERVAL 10 MINUTE)即可,核心查询逻辑一致 - PostgreSQL时态表扩展、MariaDB系统版本表语法差异极小,均可参考上述逻辑调整
内容的提问来源于stack exchange,提问作者Chris Harrington
相关产品推荐
相关产品推荐

