📜  如何在 SQL 中获取最新更新的记录?

📅  最后修改于: 2022-05-13 01:55:06.149000             🧑  作者: Mango

如何在 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'));

输出:

在上面的示例中,我们已经了解了如何获取截至今天、上周、上个月的最新记录,以及示例表的最新插入/更新记录。