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-SQLMONTH
和 DAY
函数都返回整数。您真的想将这两个数字加在一起,还是真的是在尝试比较两个日期?
【参考方案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派生列公式/语法问题的主要内容,如果未能解决你的问题,请参考以下文章