sql-server之SSIS 表达式中带时间戳的前导零

yyy_WW 阅读:58 2024-08-05 10:48:10 评论:0

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

我想要的结果是 Exceptions - YYYYMMDDHHMMSS.xls举个例子,现在是:

\\SomePath\Exceptions - 20150211155745.xls 

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

我通过尝试转换为 DT_WSTR 尝试了以下表达式设置长度并选择日期分开 usg 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 中找不到完成此操作的函数。

任何人都可以帮助我如何使用前导零格式化表达式吗?

请您参考如下方法:

您遇到的问题是 YEAR/MONTH/DAY 函数返回一个整数。整数不会出现前导零。因此,“技巧”是将其转换为字符串。在该字符串前添加一个前导零。然后,使用 RIGHT 剪掉最后 2 个字符功能。仅在 10 月、11 月和 12 月需要修剪,但无条件应用的逻辑更清晰 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.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号