SSIS表达式中带有时间戳的前导零

时间:2015-02-11 16:04:43

标签: sql-server ssis expression substring

我正在尝试使用SSIS 2008 R2格式化日期戳,使其在表达式中具有前导零。

我想要的结果是Exceptions - YYYYMMDDHHMMSS.xls所以作为一个例子,现在将是:

\\SomePath\Exceptions - 20150211155745.xls

我在将日期和月份添加前导零时遇到问题。

我尝试使用设置的长度转换为DT_WSTR以及选择与SUBSTRING分开的日期来尝试以下表达式:

@[User::XLFileRootDir] + "Exceptions - " + (DT_WSTR, 4) DATEPART("YYYY", GETDATE()) + (DT_WSTR, 2) DATEPART("MM", GETDATE()) + (DT_WSTR, 2) DATEPART("DD", GETDATE())  + ".xls"

这导致\\SomePath\Exceptions - 2015211155745.xls(注意月份缺少前导零)。

@[User::XLFileRootDir] + "Exceptions - " + (DT_WSTR, 4) SUBSTRING(GETDATE(), 1, 4) + ".xls"

由于函数DT_DBTIMESTAMP不支持数据类型SUBSTRING,因此会导致错误。我知道需要进行某种转换,但无法在SSIS中找到完成此功能的函数。

有人可以帮我解决如何使用前导零格式化表达式吗?

3 个答案:

答案 0 :(得分:8)

您遇到的问题是YEAR / MONTH / DAY函数返回一个整数。整数不会出现前导零。因此,"技巧"是将其转换为字符串。在该字符串前面加一个前导零。然后,使用RIGHT函数剪掉最后2个字符。修剪只需要在十月,十一月和十二月进行,但逻辑更清晰无条件地应用RIGHT

这会构建您的YYYYMMDD字符串。

(DT_WSTR, 4)YEAR(@[System::StartTime]) 
+ RIGHT("0" + (DT_WSTR, 2) MONTH(@[System::StartTime]), 2) 
+ RIGHT("0" + (DT_WSTR, 2) DAY(@[System::StartTime]), 2)

我发现使用变量System::StartTime而不是GETDATE()会更好,特别是在涉及时间时。每次检查时都会评估GETDATE。在长时间运行的包中,返回的值可能会有相当大的偏差。 System :: StartTime是包本身开始的时间。它对于运行本身是恒定的,但显然会重置运行。

答案 1 :(得分:0)

SUBSTRING((DT_WSTR, 29) GETDATE(), 6, 2)

答案 2 :(得分:0)

对于我的应用程序,我需要准确的当前时间,我需要它到第二个,这产生了这个:

(DT_WSTR, 4)DATEPART("yyyy",GETDATE()) 
+ RIGHT("0" + (DT_WSTR, 2) DATEPART("mm",GETDATE()),2) 
+ RIGHT("0" + (DT_WSTR, 2) DATEPART("dd",GETDATE()),2)
+ RIGHT("0" + (DT_WSTR, 2) DATEPART("Hh",GETDATE()),2)
+ RIGHT("0" + (DT_WSTR, 2) DATEPART("mi",GETDATE()),2)
+ RIGHT("0" + (DT_WSTR, 2) DATEPART("s",GETDATE()),2)