如何在 SQL 中获取最新更新的记录?
SQL Server 是一个多功能数据库,它是在许多软件行业中使用最多的关系数据库。在本文中,我们将了解如何在 SQL 中获取最新更新的记录。
第 1 步:创建数据库
创建数据库的命令。这里 GEEKSFORGEEKS 是数据库名称。
询问:
CREATE DATABASE GEEKSFORGEEKS;
第 2 步:使用创建数据库。
USE GEEKSFORGEEKS;
输出:
- 要获得最新更新的记录,我们应该在任何表中都有一个带有“Timestamp”列的“last updated”列,并且当新插入一条记录时,它应该获取该列的当前时间戳值。这将有助于创建记录
- 同时,我们应该有一个触发器来更新“最后更新”列的值,这将使用最新的时间戳更新记录。
第 3 步:创建表
CREATE TABLE [dbo].[AuthorsNew](
[ID] [int] IDENTITY(1,1) NOT NULL,
[AuthorName] [nvarchar](20) NULL,
[Age] [int] NULL,
[Skillsets] [nvarchar](max) NULL,
[NumberOfPosts] [int] NULL,
[isActiveAuthor] [bit] NULL,
[lastUpdatedBy] DATETIME
);
第 4 步:在表中插入记录
INSERT INTO AuthorsNew (AuthorName,Age,Skillsets,
NumberOfPosts,isActiveAuthor,lastUpdatedBy)
VALUES ('Rachel',25,'Java,Python,.Net',
20,1,'2021-11-12:56:40');
INSERT INTO AuthorsNew (AuthorName,Age,Skillsets,
NumberOfPosts,isActiveAuthor,lastUpdatedBy)
VALUES ('Monica Geller',25,'Android,Python,.Net'
,15,1,'2021-11-15 14:53:32');
INSERT INTO AuthorsNew (AuthorName,Age,Skillsets,
NumberOfPosts,isActiveAuthor,lastUpdatedBy)
VALUES ('Phoebe',25,'IOS,GO,R',5,1,
'2021-11-07 12:56:40');
INSERT INTO AuthorsNew (AuthorName,Age,Skillsets,
NumberOfPosts,isActiveAuthor,lastUpdatedBy)
VALUES ('Chandler',25,'Java,Python,GO',15,1,
'2021-11-09 12:56:40');
INSERT INTO AuthorsNew (AuthorName,Age,Skillsets,
NumberOfPosts,isActiveAuthor,lastUpdatedBy)
VALUES ('Ross',25,'IOS,Android',20,1,
'2021-11-11 12:56:40');
INSERT INTO AuthorsNew (AuthorName,Age,Skillsets,
NumberOfPosts,isActiveAuthor,lastUpdatedBy)
VALUES ('Joey',25,'Android',3,0,'2021-11-15
12:56:40');
INSERT INTO AuthorsNew (AuthorName,Age,Skillsets,
NumberOfPosts,isActiveAuthor,lastUpdatedBy)
VALUES ('Monica Geller',25,'Android,Python,.Net',
15,1,'2021-11-15 14:53:32');
第 5 步:从 AuthorsNew 表中获取数据。
询问:
SELECT * FROM AuthorsNew;
输出:
“LastUpdatedBy”列包含插入/更新数据的时间。首先,从日期时间单独获取日期部分。
询问:
SELECT CONVERT(VARCHAR(10),
lastUpdatedBy, 111)
from AuthorsNew;
获取最新记录:
示例 1:使用 TOP
询问:
SELECT TOP 1 * FROM AuthorsNew ORDER BY
CONVERT(VARCHAR(10), lastUpdatedBy, 111) DESC
输出:
示例 2:使用 MAX
询问:
SELECT * FROM AuthorsNew WHERE
CONVERT(VARCHAR(10), lastUpdatedBy, 111) =
(SELECT MAX(CONVERT(VARCHAR(10),
lastUpdatedBy, 111)) FROM AuthorsNew )
输出:
示例 3:使用 DATEADD FUNCTION
为了获取前一天、前一周、前一个月等数据,我们可以使用 DATEADD函数。
句法:
SELECT column_name, ... FROM table_name
WHERE date_column >= DATEADD
day,-, GETDATE())
- DATEADD()函数从当前日期减去 n 天。这里的“day”指定天数
- 将得到的结果与日期列进行比较得到结果。
假设为了获取我们表的当前日期或 1 或 2 天之前的数据,我们可以执行以下操作。即最近2天的数据可以通过下面的查询获得。
询问:
SELECT * FROM AuthorsNew WHERE
CONVERT(VARCHAR(10), lastUpdatedBy,
111) >= DATEADD(day,-2, GETDATE());
输出:
相同的 DATEADD()函数也有助于获取过去一个月的数据。
句法:
SELECT column_name, ... FROM table_name
WHERE date_column >= DATEADD
(MONTH,-, GETDATE())
即,我们需要输入 MONTH 并获取过去 6 个月的数据,而不是“day”。
在 SQL Server 中获取最后更新的记录:我们可以编写触发器(它会自动触发),即每当行发生更改(更新)时,“lastupdatedby”列值应该由当前时间戳更新。
--Trigger that fires automatically
whenever a update is done in a row
CREATE TRIGGER trigger_change_lastupdatedby
ON dbo.AuthorsNew
AFTER UPDATE
AS
UPDATE dbo.AuthorsNew
SET lastUpdatedBy = CURRENT_TIMESTAMP
WHERE id IN (SELECT DISTINCT id FROM INSERTED);
输出:
现在对 ID = 3 执行更新
询问:
UPDATE AuthorsNew SET AuthorName =
'Monica Ross Geller' WHERE ID = 3;
--We can see that 'lastupdatedby'
column also got changed because
of the trigger availability.
输出:
通过这种方式,我们也可以对记录进行修改,并且在任何时间点,我们都可以通过应用上述查询集来获取最新记录。
示例 4:使用 IDENT_CURRENT()
IDENT_CURRENT()函数接受表名 (AuthorsNew) 并返回为 AuthorsNew 表生成的最后一个标识值。通过使用这个工具,我们可以找到最后插入的记录。
询问:
SELECT * FROM dbo.AuthorsNew WHERE [id] =
(SELECT IDENT_CURRENT('dbo.AuthorsNew'));
输出:
在上面的示例中,我们已经了解了如何获取截至今天、上周、上个月的最新记录,以及示例表的最新插入/更新记录。