SQL Server 时间戳:详细介绍
作者:Charles Mahler / 用例
2023 年 1 月 23 日
导航至
准确的数据是任何组织职能最重要的方面之一。它有助于决策和规划,对于大多数企业来说,它也有助于产生收入。
数据可以是客户和产品列表,也可以是库存清单。在数据准确性、及时性和管理方面,没有什么能与 SQL 时间戳相提并论。
SQL Server 时间戳是关系数据库的关键组件,但大多数数据库专业人员并非每天都使用它们。
这篇文章将着眼于 SQL 时间戳的不同方面,以及如何在实际场景中使用它们。
什么是 SQL Server 时间戳?
SQL Server 时间戳是一种用于存储日期和时间值的数据类型。timestamp 数据类型以 YYYY-MM-DD HH:MM:SS 格式存储日期和时间值。timestamp 数据类型是一个 8 字节的值,表示 YYYY-MM-DD HH:MM:SS 格式的日期和时间值。
SQL Server 时间戳允许高效地存储和检索频繁更改的数据。时间戳以 8 字节序列存储,可用于存储精度为 1/300 秒的日期和时间。
时间戳可用于跟踪数据的更改,并可用于高效检索自给定时间点以来已更新的数据。
任何通用时间戳的格式为 YYYY-MM-DD HH:MM:SS.NNN。
先决条件
在处理数据时,最重要的方面之一是确保您正在处理准确且最新的信息。这就是时间戳的用武之地。
时间戳是一种跟踪数据何时创建或更新的方法,它们在 .NET 应用程序中可能非常有用。
在这篇文章中,我们将了解如何在 .NET 应用程序中使用 SQL Server 时间戳。但是,在我们开始之前,您必须勾选以下先决条件,以避免任何问题。请确保您具备以下条件
-
了解 .NET、C#、SQL Server 和 Entity Framework
-
SQL Server 配置(数据库名称、用户名、密码和主机)
-
用于运行程序的 Visual Studio IDE 设置
如果您拥有以上所有条件,那么您就可以开始了。如果不是,请先处理先决条件,然后再回来。我们在这里等您。
如何在 SQL Server 中创建时间戳?
您可以通过多种方式在 SQL 中存储当前日期和时间。其中一些是
-
CURRENT_TIMESTAMP:select CURRENT_TIMESTAMP
-
GETDATE():select GetDate()
上述方法的输出将为 2022-11-25 16:00:43.947,它从运行 SQL Server 实例的计算机的操作系统中派生当前时间。
在上面的示例中,您可以看到我们得到了包含时间的完整日期,包括纳秒。但是,时间戳中也存在不同的类型,具体取决于我们用于存储的数据类型。这包括
-
time (hh:mm:ss[.nnn])
-
date (YYYY-MM-DD)
-
smalldatetime (YYYY-MM-DD hh:mm:ss)
-
datetime (YYYY-MM-DD hh:mm:ss:[.nnn])
让我们看一个在 C# 代码中使用时间戳的示例,我们在其中使用 .NET 的 Entity Framework 连接 SQL Server。
示例
CREATE TABLE [UserProfiles] (
[Id] uniqueidentifier NOT NULL,
[Name] nvarchar(max) NULL,
[Email] nvarchar(max) NULL,
[Phone] nvarchar(max) NULL,
[FirstCreatedTime] datetime NOT NULL,
[LastUpdatedTime] datetime NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY ([Id])
);
这是我们将要使用的表,名为 UserProfiles。在这里,FirstCreatedTime 和 LastUpdatedTime 将分别存储首次创建帐户时的时间戳和帐户的上次更新时间。
这是将映射到数据库中 UserProfiles 表的 Model Class。
public class UserProfile
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public DateTime FirstCreatedTime { get; set; }
public DateTime LastUpdatedTime { get; set; }
}
以下是连接 SQL Server 的 Context Class。
public class UserContext : DbContext
{
public DbSet "UserProfile" UserProfiles { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(LocalDb)\\MSSQLLocalDB; Database=User; Trusted_Connection=True;");
}
}
在程序包管理器控制台中运行以下迁移命令,以将我们的模型与数据库表同步。
-
Add-Migration InitialMigration
-
Update-Database
下面,CreateUser 函数将用于首次在数据库中创建用户。
public static void CreateUser(UserProfile user)
{
using (var context = new UserContext())
{
context.UserProfiles.Add(user);
context.SaveChanges();
}
}
在这里,在 UpdateUserName 函数中,我们使用电子邮件获取记录,并相应地更新其名称和 LastUpdatedTime。
public static void UpdateUserName(string email, string updatedName){
using (var context = new UserContext())
{
var list = context.UserProfiles.ToList();
var user = list.Where(l => l.Email == email).FirstOrDefault();
if (user != null)
{
user.Name = updatedName;
user.LastUpdatedTime = DateTime.Now;
context.SaveChanges();
}
}
}
最后,Main 函数用于同时调用 Create 和 Update 函数,间隔为 5 秒,以观察存储的时间轴差异。
static void Main(string[] args)
{
var user = new UserProfile
{
Name = "XYZ Singh",
Email = "[email protected]",
Phone = "9999999999",
FirstCreatedTime = DateTime.Now,
LastUpdatedTime = DateTime.Now,
};
CreateUser(user);
Thread.Sleep(5000);
UpdateUserName("[email protected]", "XYZ Sharma");
}
输出
在表中,正如您所看到的,存储的时间轴在创建和更新记录时有 5 秒的差异。
在上面创建的 UserProfiles 表中,让我们看一个示例,如果我们想使用 SQL 查询插入记录
insert into UserProfiles values (NEWID(), 'XYZ', '[email protected]', '9999999999', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
在这里,我们也可以使用 GETDATE () 代替 CURRENT_TIMESTAMP。在这两种情况下,它们的工作方式完全相同。
了解 SQL Server 中时间戳的用途
时间戳是 数据库管理系统最重要的功能,因为它有助于防止并发问题。当多个用户尝试同时更改同一条记录时,就会发生并发,这可能会导致其中一个用户丢失其更改。
时间戳确保每个用户都在处理最新版本的记录,并有助于避免任何冲突。
在 SQL Server 中使用时间戳的好处
在 SQL Server 中使用时间戳有很多好处。时间戳提供了一种轻松跟踪数据随时间变化的方式。它们可以跟踪数据上次更新的时间以及由谁更新的。时间戳还可以用于提供数据更改的审计跟踪。
使用时间戳的另一个好处是,它们可以用于帮助确保数据完整性。时间戳可以跟踪数据上次读取的时间以及由谁读取的。公司可以使用此信息来帮助防止数据损坏。
时间戳还可以用于跟踪数据上次写入的时间以及由谁写入的。此信息可以帮助确保数据不会被意外覆盖。
此外,时间戳还可以用于帮助提高性能。开发人员可以使用时间戳来跟踪数据上次访问的时间。开发人员还可以使用此信息来帮助确定最有可能被访问的数据,并可用于帮助改进缓存策略。
了解时间序列数据库的需求
如果您的应用程序严重依赖时间戳,建议尝试使用时间序列数据库。
时间序列数据库是一种针对存储和查询随时间变化的数据而优化的数据库。时间序列数据通常存储在列式数据库中,从而可以轻松地查询一段时间内的数据。
时间序列数据库通常用于应用程序性能监控和通用数据分析,因为它们可以提供有关数据如何随时间变化的见解。时间序列数据库通常被使用 IoT 数据 的公司使用,用于 真实用户监控、边缘计算工作负载 以及 SCADA 系统中的存储等任务。
使用时间序列数据库的一些好处包括以下内容
-
TSDB 专门用于处理基于时间的数据,这意味着在时间戳相关任务方面,它们可能比其他类型的数据库更高效、更准确。
-
TSDB 通常比其他数据库提供更高的粒度级别,这意味着您可以更轻松地检索所需的特定数据。
-
TSDB 通常附带内置工具,用于分析、根据数据创建预测和可视化基于时间的数据,这可以帮助您了解应用程序随时间的性能。
结论
了解如何从数据库中获取所需信息始终很有帮助,但了解您为什么需要它甚至更有帮助。时间戳是获取有关特定操作何时发生的信息的好方法,这对于审计或其他目的很有帮助。
这篇文章概述了 SQL Server 时间戳及其工作原理。我们解释了要使用的时间戳类型,以及何时以及如何在具有 .NET 应用程序的 SQL Server 中创建时间戳。