如何在SSIS派生列转换中生成UTC datetimeoffset?
SSIS派生列UTC时间时区偏移问题处理
问题描述
- 在SSIS数据流的派生列转换中,
CreatedDate和LastModifiedDate的数据类型为DT_DBTIMESTAMP - 使用
GETUTCDATE()生成的UTC时间不带+00:00偏移量,插入SQL Server数据库时被自动附加本地时区+05:30偏移 - 尝试在派生列转换中使用
SYSDATETIMEOFFSET(),但该函数不被SSIS派生列支持
解决方案
方法1:使用脚本组件生成带偏移的UTC时间
替换派生列转换为脚本组件,在脚本中直接生成带+00:00偏移的UTC时间:
- 在数据流中添加脚本组件,选择“转换”类型
- 在脚本编辑器中,输入以下C#代码(假设输出列名为
CreatedDateOffset和LastModifiedDateOffset,类型为DT_DBTIMESTAMPOFFSET):public override void Input0_ProcessInputRow(Input0Buffer Row) { Row.CreatedDateOffset = DateTimeOffset.UtcNow; Row.LastModifiedDateOffset = DateTimeOffset.UtcNow; } - 将脚本组件的输出列映射到目标表的
datetimeoffset类型列
方法2:在SQL Server端转换时区偏移
保持SSIS派生列的GETUTCDATE()不变,在目标组件的SQL插入语句中使用SWITCHOFFSET函数转换为+00:00偏移:
INSERT INTO YourTargetTable (CreatedDate, LastModifiedDate) VALUES ( SWITCHOFFSET(CAST(? AS datetimeoffset), '+00:00'), SWITCHOFFSET(CAST(? AS datetimeoffset), '+00:00') )
注:将YourTargetTable替换为实际表名,?对应SSIS数据流中的参数
方法3:派生列表达式拼接转换(不推荐)
通过字符串拼接给UTC时间添加+00:00偏移,再转换为DT_DBTIMESTAMPOFFSET类型:
(DT_DBTIMESTAMPOFFSET, 7) (GETUTCDATE() + "+00:00")
该方法依赖字符串格式的正确性,若日期格式变化可能导致转换失败,仅作为临时方案使用
内容的提问来源于stack exchange,提问作者CleanBold
相关产品推荐
相关产品推荐

