什么是数据库的时态表?在C#中如何查询历史数据?

煙雲
发布: 2025-09-21 10:49:01
原创
694人浏览过
启用时态表需在SQL Server中创建带时间周期和系统版本控制的表,如CREATE TABLE Employees含ValidFrom、ValidTo及PERIOD FOR SYSTEM_TIME,并设置SYSTEM_VERSIONING=ON;在C#中通过Entity Framework Core使用FromSqlRaw执行FOR SYSTEM_TIME AS OF等语法查询历史数据,例如查2024年5月1日状态;适用于审计、合规等场景。

什么是数据库的时态表?在c#中如何查询历史数据?

时态表(Temporal Table)是数据库中一种能自动保存数据历史记录的机制。它允许你查询某条数据在过去任意时间点的状态,而不需要手动编写触发器或历史表来追踪变更。SQL Server 从 2016 版本开始支持系统版本化时态表(System-Versioned Temporal Table),通过与一个“历史表”配合,主表只保存当前数据,历史表则由系统自动管理,存储所有旧版本记录。

时态表的关键特性包括:

  • 包含两个时间字段:Valid FromValid To,表示每条记录的有效时间段。
  • 由数据库引擎自动维护历史数据,插入、更新、删除操作都会被记录。
  • 可通过特定语法查询过去某个时间的数据状态。

如何在 SQL Server 中启用时态表?

创建时态表需要定义时间列并启用系统版本控制。例如:

<font face="Courier New">
CREATE TABLE Employees (
    Id INT PRIMARY KEY,
    Name NVARCHAR(100),
    Position NVARCHAR(100),
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeesHistory));
</font>
登录后复制

这样,每次修改 Employees 表的数据,旧版本会自动写入 EmployeesHistory 表。

在 C# 中如何查询历史数据?

你可以通过 Entity Framework Core 结合原始 SQL 查询来获取历史数据。EF Core 原生不直接支持时态表语法,但可以使用

FromSqlRaw
登录后复制
执行时态查询。

示例:查询某个员工在 2024 年 5 月 1 日的状态:

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

阿里云-虚拟数字人 2
查看详情 阿里云-虚拟数字人
<font face="Courier New">
var date = new DateTime(2024, 5, 1);
<p>var historicalData = context.Employees
.FromSqlRaw(@"
SELECT * FROM Employees 
FOR SYSTEM_TIME AS OF {0}
WHERE Id = 1", date)
.AsNoTracking()
.ToList();
</font>
登录后复制

说明:

  • FOR SYSTEM_TIME AS OF
    登录后复制
    是查询时态表的核心语法,返回指定时间点的数据。
  • AsNoTracking()
    登录后复制
    提高性能,因为历史数据通常只读。
  • 参数化查询防止 SQL 注入。

其他常用时态查询方式还包括:

  • FOR SYSTEM_TIME BETWEEN ... AND ...
    登录后复制
    :查询时间段内的所有版本。
  • FOR SYSTEM_TIME FROM ... TO ...
    登录后复制
    :类似 BETWEEN,但边界处理不同。
  • FOR SYSTEM_TIME ALL
    登录后复制
    :返回当前和所有历史数据。

实际应用场景建议

时态表适合用于审计、合规、数据恢复等场景。在 C# 项目中,可封装时态查询为通用方法:

<font face="Courier New">
public List<Employee> GetEmployeeAtTime(int id, DateTime pointInTime)
{
    return context.Employees
        .FromSqlRaw("SELECT * FROM Employees FOR SYSTEM_TIME AS OF {0} WHERE Id = {1}",
                    pointInTime, id)
        .AsNoTracking()
        .ToList();
}
</font>
登录后复制

确保数据库连接和上下文配置正确,并且目标表已启用系统版本控制。

基本上就这些。只要数据库设置好了时态表,C# 端用原生 SQL 查询就能灵活获取历史数据。

以上就是什么是数据库的时态表?在C#中如何查询历史数据?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号