【问题标题】:Change date format M/d/yyy hh:mm:ss to yyyy-MM-dd using expression使用表达式将日期格式 M/d/yyyy hh:mm:ss 更改为 yyyy-MM-dd
【发布时间】:2019-07-29 15:24:30
【问题描述】:

嗨,我对 ssis 有一个疑问

我想使用 ssis 表达式将日期格式 M/d/yyy hh:mm:ss 更改为 yyyy-MM-dd,并且 DateFormat 变量数据类型是字符串并获取格式 like 5/28/2019 12:00:00 AM。数据如下:

2019 年 5 月 28 日上午 12:00:00

基于上述值,我希望在其他变量中输出

2019-05-28

我试过喜欢的表达方式

(DT_STR, 4, 1252) DATEPART("yy" , @[User::DateFormat])  + "-" + 
RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mm" , @[User::DateFormat]), 2)  + 
"-" + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("dd" , @[User::DateFormat]), 2)

但出现如下错误:

附加信息:

函数“YEAR”不支持数据类型“DT_WSTR” 参数号 1. 参数类型不能隐含 转换为函数的兼容类型。要执行此操作 操作,操作数需要显式强制转换 运算符。

评估函数“YEAR”失败,错误代码为 0xC0047089。

函数“YEAR”不支持数据类型“DT_WSTR” 参数号 1. 参数类型不能隐含 转换为函数的兼容类型。执行此操作 操作,操作数需要显式强制转换 运算符。

你能告诉我如何在 ssis 中编写表达式来完成这项任务

【问题讨论】:

  • 问了超过 25 个问题而不接受任何答案!!请阅读Tour page 了解更多关于投票和接受答案的信息

标签: sql-server datetime ssis etl ssis-2012


【解决方案1】:

主要错误是@[User::DateFormat] 变量是字符串变量,而DATEPART() 函数只能应用于日期时间值。 (即使字符串变量存储了日期时间值)

您可以从TOKEN() 函数中受益来实现这一目标:

TOKEN(TOKEN( @[User::DateFormat],"/",3)," ",1) + "-" + 
RIGHT("0" + TOKEN( @[User::DateFormat],"/",2),2) + "-" + 
RIGHT("0" + TOKEN( @[User::DateFormat],"/",1) ,2)

【讨论】:

    【解决方案2】:

    我为日期添加了类型转换。 这会有所帮助

    (DT_WSTR, 4) YEAR( (DT_DATE) @[User::Variable]  ) + "-" + RIGHT("0"+(DT_WSTR,2)  MONTH( (DT_DATE) @[User::Variable]  ),2) + "-" +  RIGHT("0"+(DT_WSTR, 2) DAY( (DT_DATE) @[User::Variable]  ),2)
    

    【讨论】:

      【解决方案3】:

      在您的 SSIS 包中创建一个数据类型为 String 的新变量,并使用该变量中输入的日期时间字段(此处为 @[User::Variable]),如下面的表达式所示:

      (DT_WSTR, 4) YEAR( @[User::Variable]  ) + "-" + 
      RIGHT("0"+(DT_WSTR,2)  MONTH( @[User::Variable]  ),2) + "-" +  
      RIGHT("0"+(DT_WSTR, 2) DAY( @[User::Variable]  ),2)
      

      如果需要,您可以稍后将此字符串变量转换为日期类型。

      【讨论】:

      • OP提到DateFormat变量数据类型是字符串,他怎么能使用YEAR()函数?!
      • 然后您可以使用 Date 类型转换。只是一点点变化 (DT_WSTR, 4) YEAR( (DT_DATE) @[User::Variable] ) + "-" + RIGHT("0"+(DT_WSTR,2) MONTH( (DT_DATE) @[User::Variable] ] ),2) + "-" + RIGHT("0"+(DT_WSTR, 2) DAY( (DT_DATE) @[User::Variable] ),2)
      • 这不是正确的方法,即使它给出了预期的输出。为什么要转换为日期然后转换为字符串,而您可以使用 TOKEN() 来简单地提取这些部分?
      • 同意。以前不知道token。
      • 检查TOKEN()TOKENCOUNT()函数,它们非常有用:mssqltips.com/sqlservertip/3510/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多