You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:15:06