【问题标题】:How to subtract from LSN如何从 LSN 中减去
【发布时间】:2019-02-21 08:22:17
【问题描述】:

我需要从 lsn(二进制日期)中减去 5 秒。到目前为止我取得的成就是

select DATEADD(SECOND,-5,sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn()))

但这似乎更拥挤。我寻找的是直观的东西

sys.fn_cdc_get_max_lsn()-0.5`sys.fn_cdc_get_max_lsn()

【问题讨论】:

  • LSN 不是“二进制日期”(它们之间的差异不会转化为绝对持续时间)。 CDC 提供了一种将 LSN 映射到时间戳的方法,但不需要任何 LSN 对应于“五秒前”——或者更准确地说,数据库的 LSN 对应于状态它当时并不能唯一地指示一个时间点。这就是为什么你必须使用函数进行映射,而不能随意混合和匹配 LSN 和时间。
  • 我想要实现的是获取上次更新前 5 秒记录的所有净变化
  • 所有日期类型都是二进制类型。 LNS 与日期或时间无关,这就是为什么需要fn_cdc_map_lsn_to_time。 LSN 只是一个binary(10)
  • @NithinChandran:那么您可能应该提出 that 您的问题,因为没有(直接)方法可以将时间映射到 LSN,而这正是您所需要的。将时间添加到您从 LSN 获得的映射时间只会让您成功。
  • @NithinChandran 你想做什么?而不是使用fn_cdc_get_max_lsn,您可能希望直接查询cdc.lsn_time_mapping 表并提取与最后5 秒时间段对应的所有LSN

标签: sql-server datetime change-data-capture


【解决方案1】:

创建一个自定义函数来包装它:

CREATE FUNCTION dbo.MyCustomLSNDate ()
RETURNS DATETIME
AS
BEGIN
    RETURN DATEADD(
            SECOND,
            -5,
            sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn()))
END

如果需要,您可以参数化要减去的秒数。创建后,您可以简单地编写:

SELECT dbo.MyCustomLSNDate()

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多