使用BETWEEN查询MariaDB系统版本化(时态表)无预期结果
时态表查询结果不符合预期的问题
我对结果的解读可能有误,但我不明白为什么针对时态表(系统版本)的查询结果不符合预期。我使用的是MariaDB 11.3.2(Docker镜像:MariaDB 11.3.2-MariaDB-1.11.3.2+maria~ubu2204),在控制台直接执行了以下SQL:
select registration_date,order_number,id,row_start,row_end from registration FOR SYSTEM_TIME BETWEEN '2024-04-04 19:10' and NOW() limit 5;
查询结果:
+---------------------+--------------+----+----------------------------+----------------------------+ | registration_date | order_number | id | row_start | row_end | +---------------------+--------------+----+----------------------------+----------------------------+ | 2013-02-15 14:54:50 | NULL | 1 | 2024-04-04 19:03:18.695546 | 2038-01-19 03:14:07.999999 | | 2013-02-15 14:54:49 | NULL | 2 | 2024-04-04 19:03:18.695546 | 2038-01-19 03:14:07.999999 | | 2013-02-15 14:54:49 | NULL | 3 | 2024-04-04 19:03:18.695546 | 2038-01-19 03:14:07.999999 | | 2013-02-15 14:54:49 | NULL | 4 | 2024-04-04 19:03:18.695546 | 2038-01-19 03:14:07.999999 | | 2013-02-15 14:58:10 | NULL | 5 | 2024-04-04 19:03:18.695546 | 2038-01-19 03:14:07.999999 | +---------------------+--------------+----+----------------------------+----------------------------+
我预期仅获取row_start在2024-04-04 19:10到当前时间之间的记录,但实际得到的记录row_start都早于这个时间点。
问题原因与解决方法
FOR SYSTEM_TIME BETWEEN的作用是查询在指定时间段内处于有效状态的行版本,也就是行的有效时间区间[row_start, row_end)与查询的时间范围['2024-04-04 19:10', NOW()]存在重叠的行。你返回的这些行row_end都是2038年,说明它们在2024-04-04 19:10之后仍然是有效的,所以会被查询出来。
如果你的需求是获取row_start晚于2024-04-04 19:10的行,不需要使用时态表的系统时间查询语法,直接在WHERE子句中过滤即可:
select registration_date,order_number,id,row_start,row_end from registration where row_start >= '2024-04-04 19:10' limit 5;
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

