SSIS将字符串转换为DateTime dd / mm / yyyy hh:mm:ss

时间:2012-07-30 02:03:34

标签: sql-server-2008 ssis

我想使用SSIS中的派生列转换“2152012 101946”这样的字符串。

输出应该像“21/05/2012 10:19:46”以适合 [DateTime] SQL Server 2008字段

谢谢!

2 个答案:

答案 0 :(得分:1)

您应该考虑丰富您的日期时间数据。你需要有一个适当的格式,如

  

YYYYMMDD HH:MM :: SS

或类似的东西。你不能拥有

  

YYYYMDD HH:MM:SS

如果您的数据格式正确为DDMMYYY HH:MM:SS,那么您可以在派生列中使用以下表达式

LEN(column) == 0 ? NULL(DT_DBTIMESTAMP) :
(DT_DBTIMESTAMP)(substring(column,1,2) + "-" + substring(column,3,2) + "-" +
substring(column,5,4) + " " + substring(column,10,2) + ":" substring(column,12,2)+ ":"
+ substring(column,14,2))

答案 1 :(得分:0)

DT_DBTIMESTAMP数据类型必须采用以下格式才能正确转换:

  

YYYY-MM-DD HH:MM:SS

使用日期&以“2012-07-30 02:03:10”为例,您的派生列将显示为:

(DT_DBTIMESTAMP)(SUBSTRING([column],1,4) + "-" + SUBSTRING([column],5,2) + "-" + SUBSTRING([column],7,2) + " " + SUBSTRING([column],9,2) + ":" + SUBSTRING([column],11,2) + ":" + SUBSTRING([column],13,2))

结果输出列将显示为:

  

2012-07-30 02:03:10.000

回想一下,给定日期内的任何缺失值都可以与列中的日期值连接。例如,使用字符串值“2152012 101946”,派生的列表达式将写为:

(DT_DBTIMESTAMP)(SUBSTRING([column],4,4) + "- 0" + SUBSTRING([column],3,1) + "-" + SUBSTRING([column],1,2) + " " + SUBSTRING([column],9,2) + ":" + SUBSTRING([column],11,2) + ":" + SUBSTRING([column],13,2) + ".000")

更进一步,由于字符串格式的日期通常不干净,您可以考虑编写一个条件语句,在连接之前检查值的长度。转换价值观。例如,如果2012/09/30 11:59 pm和2012/10/01 11:59 pm表示为不存在前导零的列中的字符串,则字符串可能显示为:

“2012930 115959” “20121001 115959”

为了说明当月的前导零,可以合并一个if-then-else表达式:

LEN(column) = 14 ? (DT_DBTIMESTAMP)(SUBSTRING([column],1,4) + "- 0" + SUBSTRING([column],5,1) + "-" + SUBSTRING([column],6,2) + " " + SUBSTRING([column],9,2) + ":" + SUBSTRING([column],11,2) + ":" + SUBSTRING([column],13,2)) : (DT_DBTIMESTAMP)(SUBSTRING([column],1,4) + "-" + SUBSTRING([column],5,2) + "-" + SUBSTRING([column],7,2) + " " + SUBSTRING([column],10,2) + ":" + SUBSTRING([column],12,2) + ":" + SUBSTRING([column],14,2))

请注意,上述表达式不会考虑长度小于14个字符或大于15个字符的值。在这种情况下,您可以展开上面的if-then-else表达式来嵌套不同长度的其他表达式。