我正在尝试使用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中找到完成此功能的函数。
有人可以帮我解决如何使用前导零格式化表达式吗?
答案 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)