我想使用 SSIS 中的派生列转换像“2152012 101946”这样的字符串。
输出应类似于“21/05/2012 10:19:46”以适合[DateTime] SQL Server 2008 字段
谢谢!
我想使用 SSIS 中的派生列转换像“2152012 101946”这样的字符串。
输出应类似于“21/05/2012 10:19:46”以适合[DateTime] SQL Server 2008 字段
谢谢!
您应该考虑丰富您的日期时间数据。你需要有一个正确的格式,比如
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))
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:59pm 和 2012/10/01 11:59pm 在不存在前导零的列中表示为字符串,则字符串可能显示为:
“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 表达式以嵌套不同长度的其他表达式。