【问题标题】:How to get the last 30 days of records?如何获取最近 30 天的记录?
【发布时间】:2016-08-20 03:34:46
【问题描述】:

我正在使用 MSServer,并且我有一个特定的表,我想检索过去 30 天内插入或修改的数据。 我的表不包含保存创建日期的东西,我想知道 Master 数据库中是否有一些跟踪或可以提供帮助的东西。 谢谢。

【问题讨论】:

  • 你备份你的数据库吗?
  • 不,我没有,但是为什么呢?
  • 如果您在 30 天前备份,我们可以看到自动增量列的最大值是多少。然后可以在当前表上使用此值来限制您想要的记录。
  • 可能帮助您将数据库回滚一段时间; stackoverflow.com/questions/16945254/…相当激烈的蛮力方法,取决于它对你有多重要......

标签: sql sql-server-2008 datetime


【解决方案1】:

如果在添加行时没有指示,则没有适当的方法。

【讨论】:

  • 我认为这是一个可能的评论。如果你愿意,转换它
  • @JoeTaras 这是相当苛刻的一个,但它有点正确。我不需要赞成票。我怀疑它应该是评论还是答案,并决定使用后者。
  • 亲爱的,我不认为你想要投票。我只是表达了我的意见。
  • 这是“不知道有没有办法做到这一点”的正确答案
【解决方案2】:

您可以尝试访问事务日志并获取按时间戳排序的所有插入事务的列表。然后找到上个月最后插入的行的时间戳。这些将引导您(希望)在最后插入上个月的最后一行(所有具有较高 ID 的行都是您要查找的数据)。

循序渐进(可能需要根据自己的情况对查询进行一些调整):

获取交易:

declare @TableName sysname

set @TableName = 'Table_1'

select [Current LSN],
[Operation], 
[Transaction ID], 
[Parent Transaction ID],
[Begin Time], [Transaction Name],
[Transaction SID]
from fn_dblog(null, null)
where [Operation] = 'LOP_BEGIN_XACT'
and  [Transaction ID] 
in
(   
    -- get transaction id's from your table (inserts)
    SELECT [Transaction ID]
    FROM fn_dblog(NULL, NULL) 
    WHERE 
    Operation = 'LOP_INSERT_ROWS'
    and
    AllocUnitName LIKE '%' + @TableName + '%'
)
order by [Begin Time] ASC

获取最后一笔交易:

    SELECT *
    FROM fn_dblog(NULL, NULL) 
    WHERE Operation = 'LOP_INSERT_ROWS'
    and [Transaction ID] = 'XXX' -- your transaction id 

在 den Row Log Content Rows 中,您可以找到上个月最后插入的行的数据值。现在您只需按照以下网站将插入的数据转换为“可读”数据:

http://www.sqlshack.com/reading-sql-server-transaction-log/

现在将插入的数据转换回“可读”数据后,您应该能够找到插入到表中的上个月的相关最后一行。所有 ID 高于该 ID 的行都会稍后插入,因此是您要查找的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多