时间戳到 Bigint (MSSQL) 与 DT_BYTES 到 DT_I8 (SSIS)
Posted
技术标签:
【中文标题】时间戳到 Bigint (MSSQL) 与 DT_BYTES 到 DT_I8 (SSIS)【英文标题】:Timestamp to Bigint (MSSQL) vs. DT_BYTES to DT_I8 (SSIS) 【发布时间】:2018-07-14 13:26:05 【问题描述】:在处理来自 SQL Server 的“时间戳”数据类型时,我在 SSIS 中进行正确的数据转换时遇到问题。
我有一张使用 SSIS 暂存的表。在我的数据流任务 (DFT) 顶部的源选择中,它看起来像这样:
SELECT
[SourceColumn1Timestamp] = [SourceColum1Timestamp]
, [SourceColumn2] = [SourceColumn2]
, [SourceColumn3] = [SourceColumn3]
, [SourceColumn4] = [SourceColumn4]
FROM [dbo].[Table1]
我想将 [SourceColumn1Timestamp] 转换为 Bigint,但在 SSIS 中 使用数据流任务中的数据转换组件。像这样:
所以输入列“timestamp”是“DT_BYTES”SSIS数据类型被转换成DT_I8。
但是结果与我的预期完全不同。与我在 SQL 中进行转换时得到的结果不同,将 DFT 中的源选择调整为:
SELECT
[SourceColum1Timestamp] = [SourceColum1Timestamp]
, [SourceColumn2] = [SourceColumn2]
, [SourceColumn3] = [SourceColumn3]
, [SourceColumn4] = [SourceColumn4]
, [SourceColum1Timestamp_BIGINT] = CONVERT(BIGINT, [SourceColum1Timestamp]) -- I would like to avoid this
FROM [dbo].[Table1]
怎么会?
这里有一行显示了 SQL 转换和 SSIS 之间的区别: SQL:
SSIS:
【问题讨论】:
【参考方案1】:如果您想在 SSIS 中获得与 T-SQL 相同的值,则需要在转换中反转二进制值的字节序列。这会将二进制值解释为 little-endian 序列(最低有效字节在前),因此该值将按预期转换为 64 位有符号整数。
编辑:
我不知道 SSIS 中是否有更好的方法,但您可以反转时间戳字节数组并在 C# 脚本转换中转换为 64 位整数。这是一个代替现有转换的函数:
Int64 convertTimestampToInt64(byte[] timestampBytes)
Array.Reverse(timestampBytes, 0, timestampBytes.Length);
var timestampInt64 = BitConverter.ToInt64(timestampBytes, 0);
return timestampInt64;
【讨论】:
有趣。有关在 SSIS 中反转字节序列的方法的任何指针?您是否相信在 SSIS 中以一种或另一种方式进行转换的结果? @DanGuzman 我尝试了你的建议,我给出的结果与数据转换相同。这很奇怪,即使隐式转换和使用派生列会给出与 SQLCAST()
不同的结果
@Hadi,如果你删除Reverse
,你会得到什么价值?
@DanGuzman 你说得对,我使用的是Row.Timestamp
(输入列) 而不是timestampBytes
所以当我添加以下行时timestampBytes = Row.timestamp;
它工作正常。我真的很高兴我学到了新东西。 Good Luck +1 (在第一种情况下 Array.Reverse 没有意义,因为 Row.timestamp 是只读的)【参考方案2】:
基于这个microsoft article,我认为timestamp可以隐式转换成BigInt
【讨论】:
以上是关于时间戳到 Bigint (MSSQL) 与 DT_BYTES 到 DT_I8 (SSIS)的主要内容,如果未能解决你的问题,请参考以下文章