时间戳到 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 我尝试了你的建议,我给出的结果与数据转换相同。这很奇怪,即使隐式转换和使用派生列会给出与 SQL CAST() 不同的结果 @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)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 时间戳到 Python 日期时间的转换

在 MSSQL 中将 bigint 转换为 varchar

从时间戳到正常日期[重复]

Python:从时间戳到日期时间

PDO 通过 MSSQL_* 函数连接到 MSSQL

熊猫桶时间戳到 TimeGrouper 频率组