2011-11-28 86 views
1

以下评估将给我一个设置为yyyymmdd格式的日期为int。SSIS格式日期YYYYMMDD,日偏差为X天?

我需要做的是在SSIS中有能力抵消X天的天数并相应地保持月份和年份的抵消。

我似乎找不到答案。每个人都有一个关于如何格式化它的例子,但是如果你需要在几天,几个月或几年内用偏移量来格式化它,同时保持所有部分的准确性。

RIGHT((DT_STR,4,1252)YEAR(DATEADD("dd",0,getdate())),4) +""+ 
RIGHT("0" +(DT_STR,4,1252)MONTH(DATEADD("dd",-1,getdate())),2)+""+ 
RIGHT("0" +(DT_STR,4,1252)DAY(DATEADD("dd",0,getdate())) ,2) 

有人吗?

在C#或TSQL中这很容易,但是这个SSIS正在增加我的耐心。

谢谢。

+0

可以执行存储过程和结果装载到一个变量,或者使用脚本任务,并设置变量呢?这似乎是一个更好的解决方案,因为表达式的设计并不能处理太复杂的问题。 – msmucker0527

回答

3

这是一个可能的解决方案,可以让你实现这一点。

在SSIS包中,声明四个包范围变量。

  1. TodaysDate - DateTime类型的变量。当您设置为DateTime时,变量将被分配当前的日期和时间。您也可以更改并将其设置为您选择的日期。

  2. OffsetValue - Int32类型的变量。这将保存偏移值。对于这个例子,我选择的偏移值是以天为单位。因此,我已将其设置为值7.

  3. OffsetDate - 类型DateTime的变量。选择此变量并按F4查看属性。将属性EvaluateAsExpression更改为True。将表达式设置为值DATEADD("dd", @[User::OffsetValue] , @[User::TodaysDate] )。此表达式将偏移值添加到变量TodaysDate中,以便获得新的OffsetDate。

  4. FormattedDate - 变量String。选择此变量并按F4查看属性。将属性EvaluateAsExpression更改为True。设置Expresstion为以下值

RIGHT((DT_STR,4,1252)YEAR(DATEADD("dd",0, @[User::OffsetDate])),4) +""+ RIGHT("0" +(DT_STR,4,1252)MONTH(DATEADD("dd",-1,@[User::OffsetDate])),2)+""+ RIGHT("0" +(DT_STR,4,1252)DAY(DATEADD("dd",0,@[User::OffsetDate])) ,2)

唯一的区别是要格式化您选择的日期,这里在这种情况下变量OffsetDate值。该变量将保存已经被抵消的日期。

下面的屏幕截图显示了一个示例。变量TodaysDate设置为11/28/2011。向变量添加7天将字段OffsetDate设置为12/05/2011。如您所见,变量FormattedDate将新的抵消日期格式设置为20111205

该实施例也可通过消除所述可变TodaysDate一个少变量来完成。您还可以为每种类型(如日,月和年)提供一个偏移量变量。这一切都归结于个人的偏好。

Example

我希望这是你要找的人,可能给你如何实现这一点的想法。

+2

也只是要知道,任何将使用日期变量,你可能会想要设置delayvalidation,以确保SSIS计算在运行时的正确值。 –

+0

湿婆,非常感谢你,它给了我一个肯定的一步!非常感激。 – nitefrog

1

我的个人偏好是在脚本任务中进行日期操作和格式化。 (假设你使用SSIS 2008脚本任务可以用C#编写。)

1
"C:\\inetpub\\logs\\LogFiles\\W3SVC2\\u_ex" + 
    RIGHT("0" + (DT_STR,4,1252)DATEPART("yy" , DATEADD("dd" , -1, getdate())), 2) + 
    RIGHT("0" + (DT_STR,4,1252)DATEPART("mm" , DATEADD("dd" , -1, getdate())), 2) + 
    RIGHT("0" + (DT_STR,4,1252)DATEPART("dd" , DATEADD("dd" , -1, getdate())), 2) + ".log"