Ssis 要转换为ISO8601格式的日期时间
我有一个Ssis 要转换为ISO8601格式的日期时间,ssis,iso8601,Ssis,Iso8601,我有一个getdate()字段,我想将它转换成20210211T172650Z这种格式在SSIS表达式中如何实现?在SSIS中,我们有字符串、数字和日期的数据类型。日期没有格式,当它转换为字符串值时,您将得到本地化规则规定的任何格式 如果您有一个特定的格式,那么您需要控制它,唯一可以控制它的方法是使用字符串数据类型 我们将在这里使用的模式,对于每个元素 提取数字 将数字转换为字符串 左焊盘/预加一个前导零 从字符串中提取最后2个字符 当我们提取数字时,它们是数字,数字没有前导零。我们转换成字符串
getdate()
字段,我想将它转换成20210211T172650Z
这种格式在SSIS表达式中如何实现?在SSIS中,我们有字符串、数字和日期的数据类型。日期没有格式,当它转换为字符串值时,您将得到本地化规则规定的任何格式
如果您有一个特定的格式,那么您需要控制它,唯一可以控制它的方法是使用字符串数据类型
我们将在这里使用的模式,对于每个元素
StartDate
的DateTime类型变量,并将其硬编码到一个起点。这将允许我测试各种条件。如果我使用了getdate
,那么我必须调整计算机的时钟,以确保我的代码在2001-01-01的01:01:01以及2021-12-31的23:59:59运行。当您对代码通过所有测试感到满意时,可以指定StartDate
propertyevaluatesExpression
为True,然后使用GetDate()。但我不会使用GetDate()
GetDate将在每次检查时进行评估。当您的包启动时,它将显示2021-02-12@11:16 AM,但您的包运行需要5分钟,因此当您重新使用在GetDate上构建的值时,您现在将获得2021-02-12@11:21 AM
在您的情况下,如果您多次将这些密钥发送到您的亚马逊产品,则这些密钥将不匹配。相反,请使用系统范围的变量,如@[System::StartTime]
,该变量在包开始执行时更新,并在SSIS包执行期间保持不变。因此,当您对所构建的表达式与业务规则匹配感到满意时,请将@[User::StartDate]改为使用@[System::StartTime]。它提供了更新的时间,但没有时间漂移的挑战
提取数字
SSIS表达式语言定义了年
、月
和日
,但没有时间组件的速记方法。但是,它确实有DATEPART
函数,您可以在其中请求任何指定的日期部分。我将在我所有的访问方法中使用它,因为它使它变得友好和一致
举个例子,我就是这样计算时间的。字符串,我们使用变量
DATEPART("HOUR",@[User::StartDate])
将数字转换为字符串
上一步给了我们一个数字,但我们要解决前导零的问题,所以把它转换成字符串
(DT_WSTR, 2)DATEPART("HOUR",@[User::StartDate])
转换为字符串,最大两个字符,我们生成的数字
左焊盘/预加一个前导零
字符串串接是+
运算符,由于无法将字符串串接为数字,因此必须确保两边都有正确的操作数类型
"0" + (DT_WSTR, 2)DATEPART("HOUR",@[User::StartDate])
从字符串中提取最后2个字符
因为此时可能有一个2或3个字符的字符串,所以我们将使用正确的函数只获取最后N个字符
RIGHT("0" + (DT_WSTR, 2)DATEPART("HOUR",@[User::StartDate]), 2)
最终连接
现在,我们有了令人高兴的小变量,并且检查了边界条件,剩下的唯一一件事就是生成最后一个变量,DateAsISO8601
字符串类型,EvaulateAsExpression=True
@[User::Year] + @[User::Month] +@[User::Day] + "T" +@[User::Hour] +@[User::Minute] +@[User::Second] + "Z"
8601同时定义了仅日期(YYYY-MM-DD)和日期/时间格式(亚马逊希望使用哪种格式?ISO8601格式的日期值。例如,2013072800000000Z。这与您在创建签名密钥时使用的日期相同。此值也必须与您在签署的策略(x-amz-date)中提供的值相同。这是他们在文档中提供的值,因此您已经知道该值,因为您在创建密钥时需要此日期,所以。。。是否有理由将日期转换为ISO8601格式?只需将该值作为文本字符串。我在这里遗漏了什么吗?20210211T172650Z-他们需要这种格式,我如何在SSIS表达式中创建它,这就是我需要知道的全部