SQL SSIS派生列公式/语法问题

Posted

技术标签:

【中文标题】SQL SSIS派生列公式/语法问题【英文标题】:SQL SSIS Derived Column formula/syntax issues 【发布时间】:2013-03-04 20:04:11 【问题描述】:

我有一个公式,我需要将其放入我的 SSIS 派生列中...下面是..

if MONTH(Sls.SlsDt) + DAY(Sls.SlsDt) > MONTH(TODAY) + DAY(TODAY) then
    dYdtYr = 0.
  else
    dYdtYr = YEAR(Sls.SlsDt).

如何将上述业务逻辑放入 SQL SSIS ETL 派生列转换?

派生列是完成此任务的正确选择吗?

ETL 包是从 CSV 到 SQL 临时表的导入,在此导入期间,我需要输出一个已实现上述逻辑的新列(或替换现有列)。

输入行包含 MONTH 和 DAY 以及 dYdtYr 列。从某种意义上说,我需要根据上述逻辑用新值覆盖 dYdtYr 值。

【问题讨论】:

或者,如果 SSIS 太有限,我可以执行一个 TSQL SP,它查看临时表并处理上述逻辑......然后我会在我的 SSIS ETL 中添加一个执行 SP 的步骤。 您是说如果销售月份和日期(格式为 1225)大于今天的日期 (0304) 则设置 dYtdYr = 0 否则设置 dYtdYr = 销售年份?这行得通吗? T-SQL MONTHDAY 函数都返回整数。您真的想将这两个数字加在一起,还是真的是在尝试比较两个日期? 【参考方案1】:

派生列设置为替换列,使其替换 dYtdYr。将以下内容放入表达式中:

(MONTH(Sls.SlsDt) * 100 + DAY(Sls.SlsDT) > MONTH(getdate())*100 + DAY(getdate())) ? 0 : YEAR(Sls.SlsDt)

这将月份值(3 月的 03)乘以 100 得到 300,并将其添加到日值(今天的 04)并得到一个像 0304 这样的值。这样可以使前一年中的任何一天或等于该值将小于该数字,并且今天之后一年中的任何一天都将更大。请注意,这不考虑年份。这意味着 3 年前的 12 月 31 日将在 dYtdYr 中获得 0,但 3 年前的 3 月 3 日将(今天)获得 SlsDt 的年份。我猜如果这是您想要的结果,那么您正在尝试建立一个 YTD 年同比比较。

【讨论】:

好消息@Siva 我记得 s-s-rS 表达式引擎 TODAY 是有效的并且与 getdate() 的含义相同【参考方案2】:

如果您可以使用TSQL,那么您可以使用CASE 语句

CASE 
 WHEN MONTH(Sls.SlsDt) + DAY(Sls.SlsDt) > MONTH(getDate()) + DAY(getDate()) 
 THEN dYdtYr = 0
ELSE
 dYdtYr = YEAR(Sls.SlsDt)
END AS ColumnName

【讨论】:

那行不通,如果你加上 month('2013-03-04') 3 和 day('2013-03-04') 4 你会得到 7 这在任何情况下都没有用日期比较例程。 @WilliamToddSalzman 这是他问题的确切语法。他没有直接比较任何日期。如果SlsDt 的日期是昨天,那么您将得到 6 > 7,这是一个完全有效的比较。 我可能正在阅读他的问题,试图确定他想要什么,而不是他写了什么。我们将不得不看看他试图做什么,以找出我们中的哪一个是正确的。对不起,如果我草率下结论。 @WilliamToddSalzman,它将满足 OP 的规定要求。它是否能满足 OP 的实际需要是另一回事。 @WilliamToddSalzman 你的假设绝对正确,但如果是这样,那么他现有的公式是无效的。

以上是关于SQL SSIS派生列公式/语法问题的主要内容,如果未能解决你的问题,请参考以下文章

SSIS派生列问题

在 SSIS 派生列中替换 NULL

使用 SSIS 派生列提取日期值

在 SSIS 派生列中将字符串转换为日期

无法解析我的 SSIS 派生列表达式

为啥派生列组件的表达式不适用于 SSIS 中的空值?