2

在处理来自 SQL Server 的“时间戳”数据类型时,我在 SSIS 中进行正确的数据转换时遇到问题。

我有一张使用 SSIS 暂存的表。在我的数据流任务 (DFT) 顶部的源选择中,它看起来像这样:

SELECT
     [SourceColumn1Timestamp]       = [SourceColum1Timestamp]
   , [SourceColumn2]               = [SourceColumn2]
   , [SourceColumn3]               = [SourceColumn3]
   , [SourceColumn4]               = [SourceColumn4]

FROM [dbo].[Table1]

我想将 [SourceColumn1Timestamp] 转换为 Bigint,但在 SSIS 内部使用数据流任务中的数据转换组件。像这样:

在此处输入图像描述

因此,作为“DT_BYTES”SSIS 数据类型的输入列“timestamp”被转换为 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: 在此处输入图像描述

4

2 回答 2

2

如果要在 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;
}
于 2018-02-04T16:08:09.597 回答
1

基于这篇微软文章,我认为时间戳可以隐式转换为 BigInt

隐式转换

于 2018-02-04T16:16:11.073 回答