Sql server 使用表达式将日期格式M/d/yyy hh:mm:ss更改为yyyy mm dd

Sql server 使用表达式将日期格式M/d/yyy hh:mm:ss更改为yyyy mm dd,sql-server,datetime,ssis,etl,ssis-2012,Sql Server,Datetime,Ssis,Etl,Ssis 2012,嗨,我对ssis有一个疑问 我想使用ssis表达式将日期格式M/d/yyy hh:mm:ss更改为yyy-mm-dd,日期格式变量datatype为string,并获取格式,如2019年5月28日12:00:00 AM。数据如下: 2019年5月28日上午12:00:00 基于上述值,我希望在其他变量中输出 2019-05-28 我试着表达我的想法 (DT_STR, 4, 1252) DATEPART("yy" , @[User::DateFormat]) + "-" + RIGHT("0"

嗨,我对ssis有一个疑问

我想使用ssis表达式将日期格式
M/d/yyy hh:mm:ss
更改为
yyy-mm-dd
,日期格式变量datatype为string,并获取格式
,如2019年5月28日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。该参数的类型无法隐式设置 转换为函数的兼容类型。要做到这一点 操作时,需要使用强制转换显式强制转换操作数 接线员

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

函数“YEAR”不支持的数据类型为“DT_WSTR” 参数1。该参数的类型无法隐式设置 转换为函数的兼容类型。要做到这一点 操作时,需要使用强制转换显式强制转换操作数 接线员


您能告诉我如何在ssis中编写表达式以完成此任务吗?主要错误是,
@[User::DateFormat]
变量是字符串变量,而
DATEPART()
函数只能应用于日期时间值。(即使字符串变量存储日期时间值)

您可以使用
TOKEN()
函数实现以下功能:

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

使用数据类型字符串在SSIS包中创建一个新变量,并在该变量的输入中使用datetime字段(此处为
@[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)

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

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

(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)

OP提到DateFormat变量datatype是string,他如何使用
YEAR()
函数?!然后,您可以使用日期类型强制转换。仅仅是一点变化(DT_WSTR,4)年((DT_日期)@[User::Variable])+“-”+对(“0”+(DT_WSTR,2)个月((DT_日期)@[User::Variable]),2)+“-”+对((DT_WSTR,2)天((DT_日期)@[User::Variable]),2)这不是正确的方式,即使它给出了预期的输出。既然可以使用TOKEN()简单地提取这些部分,为什么还要将日期转换为字符串呢?同意。以前不知道令牌。请检查
token()
TOKENCOUNT()
函数,它们非常有用:在不接受任何答案的情况下提出25个以上的问题!!请阅读更多关于投票和接受答案的信息