我遇到需要加载下一个季度的数据的情况,该数据应仅从第二天开始插入 数据应该是增量加载。例如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中做到这一点?
答案 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%的机会永远不会回来。