SSIS季度数据冻结

时间:2019-03-18 11:46:19

标签: ssis

我遇到需要加载下一个季度的数据的情况,该数据应仅从第二天开始插入 数据应该是增量加载。例如1月1日至3月6日.1月1日我们加载了历史加载或首次插入,然后在1月2日之后加载了增量加载。现在,我们希望在3月7日进行全新插入,并且从3月8日开始,增量负载将在3月7日对新插入的数据运行。就像我们要锁定从1月1日到3月6日的数据一样,新插入应该在3月7日进行,并且8月8日应该在3月7日加载的数据上运行增量加载。如何在SSIS中做到这一点?

1 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是创建一个日历表,并在该表中有一个特殊列,该列将每个单个日期映射到“冻结日期”属性。

所以我让您对日历表进行一些研究。

同时,没有日历表,这是让您入门的地方。

首先,此表达式为您提供当前季度的第一个月。因此,如果今天在1月至3月内的任何地方,则该表达式为您提供1。如果今天在10月至12月的任何地方,则为您10

SELECT (((MONTH(GETDATE()))-1)/3)*3+1 As FirstMonthInCurrentQuarter

现在,我们将该数字转换为每月的第一天的实际日期。

首先,生成一个数字表示形式:

SELECT 
   YEAR(GETDATE()) * 10000 +
   ((((MONTH(GETDATE()))-1)/3)*3+1) * 100 +
   1

我们只是将其转换为实际日期:

SELECT 
   CONVERT(
       DATE,
           CAST(
            YEAR(GETDATE()) * 10000 +
            ((((MONTH(GETDATE()))-1)/3)*3+1) * 100 +
            1
            AS VARCHAR(8)),
        112)

那是一个可怕的表情,可以用日历表替换。

如果您现在运行它,您将获得2019年1月1日。如果您在4月5日运行它,那么您将获得4月1日。希望您能理解它是如何自动改组的。

现在我们使用该日期来确定要加载到表中的内容。

DECLARE @LoadDate DATE

SET @LoadDate = 
   CONVERT(
       DATE,
           CAST(
            YEAR(GETDATE()) * 10000 +
            ((((MONTH(GETDATE()))-1)/3)*3+1) * 100 +
            1
            AS VARCHAR(8)),
        112)

-- Delete all the data in the target table after this date:
DELETE TargetTable WHERE TransactionDate >= @LoadDate;

-- Use your ETL tool to load this in:
INSERT INTO TargetTable (TransactionDate, Amount, Account)
SELECT TransactionDate, Amount, Account 
FROM SourceTable WHERE TransactionDate >= @LoadDate;

您的问题中没有足够的信息来找到有意义的答案,但这也许会给您一个想法

有95%的机会永远不会回来。