Ssis 要转换为ISO8601格式的日期时间

Ssis 要转换为ISO8601格式的日期时间,ssis,iso8601,Ssis,Iso8601,我有一个getdate()字段,我想将它转换成20210211T172650Z这种格式在SSIS表达式中如何实现?在SSIS中,我们有字符串、数字和日期的数据类型。日期没有格式,当它转换为字符串值时,您将得到本地化规则规定的任何格式 如果您有一个特定的格式,那么您需要控制它,唯一可以控制它的方法是使用字符串数据类型 我们将在这里使用的模式,对于每个元素 提取数字 将数字转换为字符串 左焊盘/预加一个前导零 从字符串中提取最后2个字符 当我们提取数字时,它们是数字,数字没有前导零。我们转换成字符串

我有一个
getdate()
字段,我想将它转换成
20210211T172650Z
这种格式在SSIS表达式中如何实现?

在SSIS中,我们有字符串、数字和日期的数据类型。日期没有格式,当它转换为字符串值时,您将得到本地化规则规定的任何格式

如果您有一个特定的格式,那么您需要控制它,唯一可以控制它的方法是使用字符串数据类型

我们将在这里使用的模式,对于每个元素

  • 提取数字
  • 将数字转换为字符串
  • 左焊盘/预加一个前导零
  • 从字符串中提取最后2个字符
  • 当我们提取数字时,它们是数字,数字没有前导零。我们转换成字符串,这样我们就可以在它前面加上字符零,因为我们只是在串接字符串。如果这个数字小于10,那么这个零的前缀将得到我们想要的结果。9->09如果它大于9,那么这里有一个无关的值。11 -> 011. 我们不在乎我们做得太大,因为我们会选择正确的两个角色,分别是09->09和011->11。这是在SSIS中生成前导零字符串的最短逻辑

    使用这种逻辑,我们将为格式化字符串的每个元素创建一个变量:年、月、日、小时、分钟、秒

    什么时候开始? 我创建了一个名为
    StartDate
    的DateTime类型变量,并将其硬编码到一个起点。这将允许我测试各种条件。如果我使用了
    getdate
    ,那么我必须调整计算机的时钟,以确保我的代码在2001-01-01的01:01:01以及2021-12-31的23:59:59运行。当您对代码通过所有测试感到满意时,可以指定
    StartDate
    property
    evaluatesExpression
    为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表达式中创建它,这就是我需要知道的全部